裸的模板题,Tarjan求联通量。
code:
#include <cstdio> #include <vector> #define min(a,b) a<b?a:b #define MAXN 5005 using namespace std; int N,M,DFN[MAXN],vis[MAXN],stack[MAXN],LOW[MAXN]; int nowt,top,clo[MAXN],clot,t[MAXN]; vector<int>a[MAXN]; void tarjan(int x){ DFN[x]=LOW[x]=++nowt; stack[++top]=x; vis[x]=1; for(int i=0;i<a[x].size();i++){ int to=a[x][i]; if(!DFN[to]){ tarjan(to); LOW[x]=min(LOW[x],LOW[to]); } else if(vis[to])LOW[x]=min(LOW[x],DFN[to]); } if(DFN[x]==LOW[x]){ clot++; while(stack[top]!=x)clo[stack[top]]=clot,vis[stack[top--]]=0; clo[stack[top]]=clot; vis[stack[top--]]=0; } } int main(){ scanf("%d%d",&N,&M); for(int i=1;i<=M;i++){ int x,y,c;scanf("%d%d%d",&x,&y,&c); a[x].push_back(y); if(c>1)a[y].push_back(x);//双向边 } for(int i=1;i<=N;i++){ if(!DFN[i])tarjan(i); } for(int i=1;i<=N;i++)t[clo[i]]++; int j=0; for(int i=1;i<=N;i++)if(t[i]>t[j])j=i;printf("%d ",t[j]); for(int i=1;i<=N;i++)if(clo[i]==j)printf("%d ",i); return 0; }
模板,加深印象