数据结构实验之图论八:欧拉回路

来源:互联网 发布:比特彗星tcp端口阻塞 编辑:程序博客网 时间:2024/06/18 17:57

Think:
1知识:
1>欧拉回路:从一点出发经过图中每边一次且仅一次又回到出发点
2>无向图存在欧拉回路:无向连通图+所有结点度为偶数
2知识点:并查集
3知识拓展:
1>有向图存在欧拉回路:有向连通图+所有结点入度等于出度
2>混合图存在欧拉回路:
——建议参考博客

SDUT题目链接

以下为Accepted代码

#include <bits/stdc++.h>using namespace std;int n, f[1004], deg[1004];void Init();int get_f(int v);void Merge(int u, int v);bool Ans();int main(){    int T, m, i, u, v;///n为全局变量注意不要重复定义    scanf("%d", &T);    while(T--){        scanf("%d %d", &n, &m);        memset(deg, 0, sizeof(deg));        Init();        for(i = 1; i <= m; i++){            scanf("%d %d", &u, &v);            Merge(u, v);            deg[u]++, deg[v]++;        }        if(Ans())            printf("1\n");        else            printf("0\n");    }    return 0;}void Init(){    for(int i = 1; i <= n; i++)        f[i] = i;}int get_f(int v){    if(f[v] == v)        return f[v];    else {        f[v] = get_f(f[v]);        return f[v];    }}void Merge(int u, int v){    int t1 = get_f(u);    int t2 = get_f(v);    if(t1 != t2)        f[t2] = t1;}bool Ans(){    int cnt = 0, flag = 0;    for(int i = 1; i <= n; i++){        if(f[i] == i)            cnt++;        if(deg[i]%2 != 0)            flag = 1;        if(flag || cnt > 1)            break;    }    if(flag || cnt != 1)        return false;    else        return true;}/***************************************************User name: Result: AcceptedTake time: 0msTake Memory: 256KBSubmit time: 2017-07-14 16:24:25****************************************************/
原创粉丝点击