uva10596-清晨漫步
此题为白书数据结构基础图的训练参考
题目链接 http://acm.hust.edu.cn/vjudge/problem/19493
解题思路
求无向图的欧拉回路。
每个顶点的度为偶数<=>存在欧拉回路
注意 要忽略孤立点。如果全为孤立点就直接Not Possible。
忽略后还要判断剩余的图是否连通。
读取边<i,j>的时候如果i==j不要把i,j的度都加一了。。。
代码
#include<iostream> #include<cstdio> #include<string.h> //#define LOCAL using namespace std; const int maxLen = 205; int G[maxLen][maxLen]; int du[maxLen]; int vis[maxLen]; int q[maxLen*2]; int n, m; bool BFS(int i) { int count = 0, now = n; int front=-1, rear=-1; for(int j=0; j<n; j++) if(du[j]==0) now--; if(now==0) return false; q[++rear] = i; vis[i] = 1; count++; while(front != rear) { int u=q[++front]; for(int j=0; j<n; j++) if(G[u][j] && !vis[j] && du[j]) { vis[j] = 1; q[++rear] = j; count++; } } if(count != now) return false; else return true; } int main() { #ifdef LOCAL freopen("data.txt", "r", stdin); freopen("ans.txt", "w", stdout); #endif while(scanf("%d%d", &n, &m) == 2) { bool flag = true; memset(vis, 0, sizeof(vis)); memset(G, 0, sizeof(G)); memset(du, 0, sizeof(du)); for(int i=0; i<m; i++) { int j, k; scanf("%d%d", &j, &k); G[j][k] = G[k][j] = 1; if(j!=k) { du[j]++; du[k]++; } } int i; for(i=0; i<n; i++) if(du[i]!=0) break; if(!BFS(i)) flag = false; else for(int i=0; i<n; i++) if(du[i]%2!=0) flag = false; if(flag) cout << "Possible" << endl; else cout << "Not Possible" << endl; } return 0; }

浙公网安备 33010602011771号