标签:case image href article mil long imp 地方 osi
Description
Input
Output
Sample Input
1 7 8 3 4 1 4 1 3 7 1 2 7 7 5 5 6 6 2
Sample Output
4
Source
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; #define N 5000 vector<int>q[N]; int vis[N]; int n,m; int ans; void dfs(int a,int pos) { int i; vis[a]=pos; for(i=0;i<q[a].size();i++) { int x=q[a][i]; if(!vis[x]) dfs(x,pos+1); else if(vis[a]-vis[x]+1>ans) //比如环 1 2 3 4 1 ,vis[1]=1,vis[4]=4,下一次4与 //1相连。可是已经vis[1],所以环的大小 vis[4]-vis[1]+1 ans=vis[a]-vis[x]+1; } } int main() { int i,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(vis,0,sizeof(vis)); int x,y; for(i=1;i<=n;i++) //记得清空上次的数据 q[i].clear(); while(m--) { scanf("%d%d",&x,&y); q[x].push_back(y); //q[x]存与x的临边 q[y].push_back(x); //同理 } ans=0; for(i=1;i<=n;i++) if(!vis[i]) //由于一个点就会出现一次。即使两个环有共同边, //那么在公共边那个分叉点还是会分别进行dfs的 dfs(i,1); //不加以下会错 if(ans<=2)//一个环须要3个点。可是我郁闷了。假设没有环的话 //怎么会有vis[x]已经标记了呢?(此时ans=0啊)难道有数据相似 // a b b a (⊙o⊙)… ans=0; printf("%d\n",ans); } return 0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 4500 int ans,vis[N],head[N]; int n,m,num; struct stud{ int to,next; }e[N*2]; void build(int u,int v) { e[num].to=v; e[num].next=head[u]; head[u]=num; num++; } void dfs(int x,int pos) { vis[x]=pos; int i; for(i=head[x];i!=-1;i=e[i].next) { if(vis[e[i].to]) ans=max(ans,vis[x]-vis[e[i].to]+1); else dfs(e[i].to,pos+1); } } int main() { int i,j,v,u,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); num=0; while(m--) { scanf("%d%d",&v,&u); build(v,u); build(u,v); } memset(vis,0,sizeof(vis)); ans=0; dfs(1,0); if(ans<3) ans=0; printf("%d\n",ans); } return 0; }
POJ 3895 Cycles of Lanes (dfs)
标签:case image href article mil long imp 地方 osi
原文地址:http://www.cnblogs.com/lxjshuju/p/6847005.html