ccf 201512-4 送货 无向图欧拉回路

来源:互联网 发布:中美打击网络犯罪 编辑:程序博客网 时间:2024/04/27 21:40

Problem:
n个节点m条路,看成一个无向图,判断能否每条路直走一次。
Solution:
先判断度,只能是1个或2个奇数度。
然后判断边的数目是否等于m,否则是非连通图。
然后按字典序最小遍历即可,此时一定会有一条回路。

#include <stdio.h>#include <queue>using namespace std;const int max_v = 15;int G[max_v][max_v];int degree[max_v];int n, start = 0, edge = 0;queue<int> q;bool okDeg() {//只能有0个或2个点是奇数个度    int odd = 0;    for (int i = 0; i < n; i++) {        if(degree[i]%2 != 0) {            odd++;            if(start != 0)                start = min(i, start);        }        if(odd > 2)            return false;    }    if(odd == 1)        return false;    else        return true;}void dfs(int root) {//判断无向图的连通性    edge++;    q.push(root);    for(int i = 0; i < n; i++) {        if(G[root][i]>0) {            G[root][i] = G[i][root] = 0;            dfs(i);        }    }}/* 4 6 1 2 1 3 1 4 2 4 3 4 2 3 */int main() {    //    freopen("/Users/really/Documents/code/input","r",stdin);    memset(G, 0, sizeof(G));    int m;    scanf("%d%d", &n, &m);    for(int i = 0; i < m; i++) {        int a, b;        scanf("%d%d", &a, &b);        G[a-1][b-1] = G[b-1][a-1] = 1;        degree[a-1]++;  degree[b-1]++;    }    if(!okDeg())        printf("-1\n");    else {        dfs(start);        if(edge-1 != m)            printf("-1\n");        else {            printf("%d", q.front()+1);  q.pop();            while(!q.empty()) {                printf(" %d", q.front()+1);                q.pop();            }            printf("\n");        }    }    return 0;}
原创粉丝点击