美文网首页
欧拉回路的判断

欧拉回路的判断

作者: db5bacb5a79c | 来源:发表于2015-08-05 18:10 被阅读121次

    #include <bits/stdc++.h>

    using namespace std;

    const int N=1005;

    int G[N][N];///邻接矩阵存储图

    int vis[N];///遍历时标记该点是否被访问过

    int deg[N];///存储节点的度

    void dfs(int v,int n){///深度优先遍历,递归

    vis[v]=1;

    for(int i=1; i<=n; ++i){

    if(G[v][i]&&!vis[i]) dfs(i,n);

    }

    }

    void init(){

    memset(G,0,sizeof(G));

    memset(vis,0,sizeof(vis));

    memset(deg,0,sizeof(deg));

    }

    int main(){

    int n,m;

    while(scanf("%d%d",&n,&m)!=EOF&&n){

    init();

    int flag=1;

    for(int i=0; i

    int u,v;scanf("%d %d",&u,&v);

    G[u][v]=G[v][u]=1;deg[u]++;deg[v]++;

    }

    dfs(1,n);///从第一个顶点搜索

    for(int i=1; i<=n; ++i){

    if(!vis[i]){

    flag=0;///若有点未曾被访问,即一次深度遍历有未访问的点,则不存在欧拉回路

    break;

    }

    if(deg[i]&1){

    flag=0;///若有点的度不是偶数,则不存在欧拉回路

    break;

    }

    }

    if(flag) puts("1");

    else puts("0");

    }return 0;

    }

    并查集:

    #include <bits/stdc++.h>

    using namespace std;

    const int N=1005;

    int deg[N],fa[N];

    int t,n,m;

    int Find(int x){

    if(x==fa[x]) return x;

    return fa[x]=Find(fa[x]);

    }

    void Union(int x,int y){

    int fx=Find(x);int fy=Find(y);

    if(fx!=fy) fa[x]=fy;

    }

    bool solve(){

    int cnt=0;

    for(int i=1; i<=n; ++i){

    if(fa[i]==i) cnt++;

    }

    if(cnt!=1) return false;

    for(int i=1; i<=n; ++i){

    if(deg[i]&1) return false;

    }

    return true;

    }

    int main()

    {

    while(scanf("%d%d",&n,&m)!=EOF&&n){

    for(int i=1; i<=n; ++i) {fa[i]=i,deg[i]=0;}

    int u,v;

    for(int i=0; i

    scanf("%d%d",&u,&v);Union(u,v);deg[u]++;deg[v]++;

    }

    if(solve()) puts("1");

    else puts("0");

    } return 0;

    }

    相关文章

      网友评论

          本文标题:欧拉回路的判断

          本文链接:https://www.haomeiwen.com/subject/wvzvqttx.html