Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
两次BFS遍历解决,貌似不算很难...第一次遍历的时候判环,遍历完判断连通,第二次遍历判断是否存在度大于1的节点的邻居度也大于1 我竟然在序号每次加1上出错debug了半天。。。 #include<stdio.h> #include<queue> #include<stack> #include<algorithm> #include <cstring> using namespace std; int n,e; int g[101][101]; int vis[101]; int d[101]; bool solve() { memset(d,0,sizeof(d)); queue<int> q; q.push(1); int cur; while(!q.empty())// 求度 { cur = q.front(); vis[cur] = 1; q.pop(); int loop_count = 0; for(int i = 1;i<=n;i++) { if(i!=cur && !vis[i] && g[cur][i]) { d[cur]++; d[i]++; q.push(i); } if(i!=cur && vis[i] && g[cur][i]) { loop_count ++; } } if(loop_count>=2) { return false; } } for(int i = 1;i<=n;i++) { if(!vis[i]) { return false; } } q.push(1); while(!q.empty()) { cur = q.front(); vis[cur] = 0; q.pop(); if(d[cur] == 1) { for(int i = 1;i<=n;i++) { if(i!=cur && vis[i] && g[cur][i]) { q.push(i); } } }else { int count = 0; for(int i = 1;i<=n;i++) { if(i!=cur && vis[i] && g[cur][i]) { q.push(i); } if(i!=cur && d[i]>1 && g[cur][i]) { count++; } } if(count>2) { return false; } } } return true; } /** * POJ 3310 * @return */ int main() { int i = 1; while(1) { scanf("%d",&n); if(!n) { break; } scanf("%d",&e); memset(vis,0,sizeof(vis)); memset(g,0,sizeof(g)); int l,r; for(int i = 0;i<e;i++) { scanf("%d",&l); scanf("%d",&r); g[l][r] = 1; g[r][l] = 1; } bool res = solve(); if(res) { printf("Graph %d is a caterpillar.\n",i); }else { printf("Graph %d is not a caterpillar.\n",i); } i++; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator