标签:des mis set space ret mem pairs turn time
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 31533 | Accepted: 12817 |
Description
Input
Output
Sample Input
3 3 1 2 2 1 2 3
Sample Output
1
Hint
#include <cstdio> #include <cstring> #include <iostream> #include <vector> using namespace std; const int maxn=12000; vector<int>tu[maxn]; vector<int>lt[maxn]; int n,m,lts=0; int js=0; int dfn[maxn],low[maxn]; int zhan[maxn],top=0; bool isins[maxn]; int num[maxn];//num[i]表示i点所在的强连通分量的编号 int d[maxn]; void tarjan(int i)//hhhh { int j; dfn[i]=low[i]=++js; isins[i]=1; zhan[top++]=i; for(int j=0;j<tu[i].size();j++) { int tp=tu[i][j]; if(dfn[tp]==-1) tarjan(tp), low[i]=min(low[i],low[tp]); else if(isins[tp]) low[i]=min(low[i],dfn[tp]); } if(dfn[i]==low[i]) { lts++; do{ j=zhan[--top]; isins[j]=0; lt[lts].push_back(j); num[j]=lts;//j点所在的强连通分量的编号为lts }while(i!=j); } } void solve(int n) { memset(dfn,-1,sizeof dfn); memset(low,-1,sizeof low); memset(zhan,-1,sizeof zhan); memset(isins,0,sizeof isins); for(int i=0;i<n;i++) if(dfn[i]==-1) tarjan(i); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); tu[x-1].push_back(y-1);//我从0开始啊 } solve(n); for(int i=0;i<n;i++) for(int j=0;j<tu[i].size();j++) { int t=tu[i][j]; if(num[i]!=num[t])//如果i点与他指向的点不在同一个强连通分量中 d[num[i]]++;//i点所在的强连通分量的出度+1 } int pos=-1; int cnt=0; for(int i=1;i<=lts;i++) if(d[i]==0)//找到出度为0的强连通分量 cnt++, pos=i; if(cnt==1) cout<<lt[pos].size();//如果只有一个出度为0的强连通分量,那么这个强连通分量的长度即答案 else cout<<"0";//woc return 0; }
标签:des mis set space ret mem pairs turn time
原文地址:http://www.cnblogs.com/xiaoningmeng/p/6071568.html