标签:奶牛 clu lib 有向图 color 多少 size nod 其他
5 4 2 4 3 5 1 2 4 1
1
一句话题意。给定一个有向图,问有多少个大于等于2的强联通分量。多组数据,练习模板清空数组。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 struct node 7 { 8 int next,to; 9 } e[100005]; 10 int head[10005],dfn[10005],low[10005],cnt,time,s[10005]; 11 int vis[10005],ans; 12 inline void insert(int u,int v) 13 { 14 e[++cnt].next=head[u]; 15 head[u]=cnt; 16 e[cnt].to=v; 17 } 18 inline void tarjan(int now) 19 { 20 dfn[now]=low[now]=++time; 21 s[++s[0]]=now;vis[now]=1; 22 for(int i=head[now];i;i=e[i].next) 23 { 24 if(!dfn[e[i].to]) 25 { 26 tarjan(e[i].to); 27 low[now]=min(low[now],low[e[i].to]); 28 } 29 else if(vis[e[i].to]) 30 low[now]=min(low[now],dfn[e[i].to]); 31 } 32 if(low[now]==dfn[now]) 33 { 34 int num=1; 35 vis[now]=0; 36 while(s[s[0]]!=now) 37 { 38 vis[s[s[0]]]=0; 39 num++; 40 s[0]--; 41 } 42 s[0]--; 43 if(num>=2) ans++; 44 } 45 } 46 int main() 47 { 48 int n,m,u,v; 49 while(scanf("%d%d",&n,&m)!=EOF) 50 { 51 memset(dfn,0,sizeof(dfn)); 52 memset(low,0,sizeof(low)); 53 memset(head,0,sizeof(head)); 54 memset(s,0,sizeof(s)); 55 cnt=0,time=0,ans=0; 56 for(int i=1;i<=m;i++) 57 { 58 scanf("%d%d",&u,&v); 59 insert(u,v); 60 } 61 for(int i=1;i<=n;i++) 62 if(!dfn[i]) tarjan(i); 63 printf("%d\n",ans); 64 } 65 return 0; 66 }
标签:奶牛 clu lib 有向图 color 多少 size nod 其他
原文地址:http://www.cnblogs.com/Dndlns/p/7858068.html