zoukankan      html  css  js  c++  java
  • Uva 10054 欧拉回路 打印路径

    看是否有欧拉回路 有的话打印路径

    欧拉回路存在的条件:

    如果是有向图的话

    1.底图必须是连通图

    2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1

    如果是无向图的话

    1.如果这个无向图的连通的 当最多只有两个度数为奇数的点 就一定有欧拉回路 

    当有两个度数为奇数的点的时候 一个为起点 一个为终点

    //============================================================================
    // Name        : UVA.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <map>
    #include <vector>
    using namespace std;
    const int MAXN=1010;
    int F[60];
    int find(int x)
    {
        if(F[x]==-1)return x;
        else return F[x]=find(F[x]);
    }
    void bing(int x,int y)
    {
        int t1=find(x);
        int t2=find(y);
        if(t1!=t2)F[t1]=t2;
    }
    int num[60];
    int G[60][60];
    void Traverse(int u)
    {
        for(int v=1;v<=50;v++)
            if(G[u][v]>0)
            {
                G[u][v]--;
                G[v][u]--;
                Traverse(v);
                printf("%d %d
    ",v,u);
            }
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
    //    freopen("out.txt","w",stdout);
        int T;
        int n;
        scanf("%d",&T);
        int iCase=0;
        while(T--)
        {
            if(iCase>0)printf("
    ");
            iCase++;
            scanf("%d",&n);
            int u,v;
            memset(F,-1,sizeof(F));
            memset(num,0,sizeof(num));
            memset(G,0,sizeof(G));
            for(int i=0;i<n;i++)
            {
                scanf("%d%d",&u,&v);
                num[u]++;
                num[v]++;
                bing(u,v);
                G[u][v]++;
                G[v][u]++;
            }
            bool flag=true;
            int temp=-1;
            for(int i=1;i<=50;i++)
            {
                if(num[i]==0)continue;
                if(num[i]%2)
                {
                    flag=false;
                    break;
                }
                if(temp==-1)
                {
                    temp=find(i);
                    continue;
                }
                if(temp!=find(i))
                {
                    flag=false;
                    break;
                }
            }
            printf("Case #%d
    ",iCase);
            if(!flag)
            {
                printf("some beads may be lost
    ");
                continue;
            }
            for(int i=1;i<=50;i++)
                if(num[i]!=0)
                {
                    u=i;
                    break;
                }
            Traverse(u);
        }
        return 0;
    }
  • 相关阅读:
    js拖拽效果 javascript实现将元素拖拽如某容器效果demo
    使用 transform3D 造成网页闪动的底层原因剖析
    设置文字垂直 竖向 显示
    文本光标,高亮选中一些出来
    HTMl5的sessionStorage和localStorage
    event 事件兼容性处理 keycode 大全
    收藏个支持进度条与文件拖拽上传的js File Uploader
    three.js 3D效果
    Winform下的地图开发控件(GMap.NET)使用心得
    ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7544691.html
Copyright © 2011-2022 走看看