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;
}

 

posted @ 2016-08-11 13:09  啊嘞  阅读(186)  评论(0)    收藏  举报