Advertisement
Guest User

Untitled

a guest
Mar 24th, 2016
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long mod = 1e9+7;
  4. const long double eps = 1e-12;
  5. double PI = 3.14159265359;
  6. #define readFile freopen("input","r",stdin)
  7. #define writeFile freopen("output","w",stdout)
  8. #define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  9. typedef pair<int,int> ii;
  10. typedef unsigned long long ULL;
  11. const int INF = 1e8;
  12. const int N=1001,M=2001;
  13. vector<vector<int> > G,dag,bip;
  14. int root[N],rnk[N],V[N],match[M],V2[M],disc[N],low[N],stm[N],t,n,m,v1,v2,res,pntr;
  15. stack<int> st;
  16. vector<ii> E;
  17. vector<int> ver;
  18. inline void init(){for(int i=1;i<=n;i++)root[i]=i,rnk[i]=0;}
  19. int find(int x){return x==root[x]?x:root[x]=find(root[x]);}
  20. inline void merge(int a,int b){
  21.     a = find(a);
  22.     b = find(b);
  23.     if (a==b) return;
  24.     if (rnk[a]<rnk[b]) swap(a,b);
  25.     if (rnk[a]==rnk[b]) rnk[a]++;
  26.     root[b]=a;
  27. }
  28.  
  29. void dfs(int u){
  30.     V[u] = 1;
  31.     for(int i=0;i<G[u].size();i++){
  32.         int v = G[u][i];
  33.         if (!V[v]) dfs(v);
  34.     }
  35.     st.push(u);
  36. }
  37.  
  38. int aug(int u){
  39.     if (V2[u]) return 0;
  40.     V2[u] = 1;
  41.     for(int i=0;i<bip[u].size();i++){
  42.         int v = bip[u][i];
  43.         if (!match[v]||aug(match[v])){
  44.             match[v] = u;
  45.             return 1;
  46.         }
  47.     }
  48.     return 0;
  49. }
  50.  
  51. void dfs4(int u,int ss){
  52.     V[u] = 1;
  53.     for(int i=0;i<dag[u].size();i++){
  54.         int v = dag[u][i];
  55.         if (V[v]) continue;
  56.         dfs4(v,ss);
  57.         if (ss!=v)
  58.             bip[ss].push_back(ver.size()+v);
  59.     }
  60. }
  61.  
  62. void tarjan(int u){
  63.     disc[u] = low[u] = pntr++;
  64.     stm[u] = 1;
  65.     st.push(u);
  66.     for(int i=0;i<G[u].size();i++){
  67.         int v = G[u][i];
  68.         if (!disc[v]){
  69.             tarjan(v);
  70.             low[u] = min(low[u],low[v]);
  71.         }
  72.         else{
  73.             if (stm[v]) low[u] = min(low[u],disc[v]);
  74.         }
  75.     }
  76.     if (low[u]==disc[u]){
  77.         while (st.top()!=u){
  78.             merge(u,st.top());
  79.             stm[st.top()] = 0;
  80.             st.pop();
  81.         }
  82.         stm[st.top()] = 0;
  83.         st.pop();
  84.     }
  85. }
  86.  
  87.  
  88. int main(){
  89. #ifndef ONLINE_JUDGE
  90.     readFile;
  91. //    writeFile;
  92. #endif
  93.     fastIO;
  94.     scanf("%d",&t);
  95.     for(int t1=1;t1<=t;t1++){
  96.         scanf("%d%d",&n,&m);
  97.         res = 0; pntr = 1;
  98.         G.clear(); dag.clear(); E.clear(); ver.clear(); bip.clear();
  99.         G.resize(N); dag.resize(N); bip.resize(M);
  100.         init();
  101.         for(int i=1;i<=m;i++){
  102.             scanf("%d%d",&v1,&v2);
  103.             E.push_back(make_pair(v1,v2));
  104.             G[v1].push_back(v2);
  105.         }
  106.         memset(V,0,sizeof(V));
  107.         for(int i=1;i<=n;i++) if (!V[i]) dfs(i);
  108.         memset(disc,0,sizeof(disc));
  109.         for(int i=1;i<=n;i++){
  110.             if (!disc[i]){
  111.                 tarjan(i);
  112.             }
  113.         }
  114.         while (!st.empty()) st.pop();
  115.         for(int i=1;i<=n;i++) if (root[i]==i) ver.push_back(i);
  116.         for(int i=0;i<E.size();i++){
  117.             int u = find(E[i].first);
  118.             int v = find(E[i].second);
  119.             if (u==v) continue;
  120.             dag[u].push_back(v);
  121.         }
  122.         for(int i=0;i<ver.size();i++) {
  123.             memset(V,0,sizeof(V));
  124.             dfs4(ver[i],ver[i]);
  125.         }
  126.         memset(match,0,sizeof(match));
  127.         for(int i=0;i<ver.size();i++){
  128.             int u = ver[i];
  129.             memset(V2,0,sizeof(V2));
  130.             res+=aug(u);
  131.         }
  132.         res = ver.size() - res;
  133.         printf("Case %d: %d\n",t1,res);
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement