CSP 201512-4 送货 欧拉通路

CSP 201512-4 送货

无向图有欧拉通路的前提:
1.为连通图
2.奇度顶点为0或者2

#include<iostream>
using namespace std;
#include<set>
#define N 10005
#define M 100005


set<int> g[N]; //set特性 从小到大


int sum_odd;

int ans[M];
int n,m;
int top;  //模拟栈

int fa[N];


void dfs(int u)
{
    
    

    while(g[u].size()) 
    {
    
    
        int v=*g[u].begin();  //g[u].begin  返回指针 
        g[u].erase(v);  //删除边   
        g[v].erase(u);

        dfs(v); //深搜


    }
    ans[top++]=u; //度数为0的点进栈

}

void init() //初始化fa数组
{
    
    
    for(int i=1;i<=n;i++)
    {
    
    
        fa[i]=i;
     } 
}

int find(int x)
{
    
    
    if(fa[x]!=x)
    {
    
    
        fa[x]=find(fa[x]);
    }

    return fa[x];

}


int main()
{
    
    
    cin>>n>>m;
    init();
    int u,v;
    for(int i=0;i<m;i++)
    {
    
    
        scanf("%d %d",&u,&v);
        g[u].insert(v);
        g[v].insert(u);

        if(find(u)!=find(v))
        {
    
    
            fa[find(u)]=find(v);
        }
    }
    int c=find(1); 

    for(int i=2;i<=n;i++)  //首先判断是否构成连通图
    {
    
    
        if(find(i)!=c)
        {
    
    
            cout<<-1;
            return 0;
        }
    }

    for(int i=1;i<=n;i++)   //计算奇数顶点的个数
    {
    
    
        if(g[i].size()%2)
            sum_odd++;
    }



    if(!sum_odd || (sum_odd==2 && g[1].size() %2==1)) //奇数顶点为0 或者 奇数顶点为2个且顶点1为奇数顶点
    {
    
    
        dfs(1);

        for(int i=top-1;i>=0;i--)  //栈输出
        {
    
    
            printf("%d ",ans[i]);
        }
    }
    else {
    
    
        cout<<-1;
    }

    return 0;
 } 


猜你喜欢

转载自blog.csdn.net/weixin_45448563/article/details/114241005