标签:
Description
Input
Output
Sample Input
Sample Output
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<string> #include<algorithm> #include<vector> #include<set> #include<stack> #include<queue> #include<map> using namespace std; stack<int> s; vector<int> e[50005],mp[50005]; int use[50005],Dfs[50005],low[50005]; int mark[50005],link[50005],isstack[50005]; int newflag,top; int n,m; struct node { int x,y; }nd[150005]; void init() { memset(use,0,sizeof(use)); memset(Dfs,0,sizeof(Dfs)); memset(low,0,sizeof(low)); memset(link,-1,sizeof(link)); memset(isstack,0,sizeof(isstack)); top=0; newflag=0; while(!s.empty()) s.pop(); for(int i=1;i<=n;i++) e[i].clear(),mp[i].clear(); } bool dfs(int x) { for(int i=0;i<mp[x].size();i++) { int v=mp[x][i]; if(mark[v]==-1) { mark[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=x; return true; } } } return false; } void tarjan(int u) { Dfs[u]=low[u]=++top; isstack[u]=1; s.push(u); for(int i=0;i<e[u].size();i++) { int v=e[u][i]; if(!Dfs[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(isstack[v]) { low[u]=min(low[u],Dfs[v]); } } if(Dfs[u]==low[u]) { newflag++; int x; do { x=s.top(); s.pop(); use[x]=newflag; isstack[x]=0; }while(x!=u); } } int main() { int tt; scanf("%d",&tt); while(tt--) { init(); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&nd[i].x,&nd[i].y); e[nd[i].x].push_back(nd[i].y); } for(int i=1;i<=n;i++) { if(!Dfs[i]) tarjan(i); } for(int i=0;i<m;i++) { int x,y; x=use[nd[i].x],y=use[nd[i].y]; if(x==y) continue; mp[x].push_back(y); } int ans=0; for(int i=1;i<=newflag;i++) { memset(mark,-1,sizeof(mark)); if(dfs(i)) ans++; } printf("%d\n",newflag-ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4436037.html