hdu1878-判断欧拉回路-欧拉回路

http://acm.hdu.edu.cn/showproblem.php?pid=1878
主要是好像下一道题就是求 欧拉回路的。。
用dfs判断连通性,或者用并查集都行。
还是研究生复试题,好水。。
看来我考研有希望了qwq
欧拉回路的条件。(就是一笔画问题啦)
① 无向图
一个连通块,所有顶点度数均为偶数。
② 有向图
所有顶点入度等于出度
欧拉通路(就是画完,并不是回路,但是要画完)
无向图
① 奇度顶点个数为0或者2个。
有向图
② 所有入度等于出度,或者只有两个不等于,一个入度大于出度1,一个入度小出度一个
混合图欧拉回路(不会,就像不会双调旅行商那样。。)

 #include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+3;
int du[1004];
int fa[1004];
void init(){
   for(int i=0;i<1004;i++)
       fa[i]=i;
}
int  find1(int a){
    if(a==fa[a]) return a;
    return fa[a]=find1(fa[a]);
}
void unite(int a,int b){
    int x=find1(a);
    int y=find1(b);
    if(x!=y)
        fa[a]=y;
    return ;
}
int main()
{    int m,n,a,b;
     while(~scanf("%d",&m)){
          if(m==0)break;
          scanf("%d",&n);
          memset(du,0,sizeof(du));
          init();
          for(int i=0;i<n;i++){
              scanf("%d%d",&a,&b);
             unite(a,b);
             du[a]++;du[b]++;
          }
          bool flag=true;
          int sum=0;
          for(int i=1;i<=m;i++){
              if(fa[i]==i)
                sum++;
          }
          if(sum>1) flag=false;
          for(int i=1;i<=m;i++){
              if(du[i]&1)
                flag=false;
          }
          if(flag)
            puts("1");
          else
            puts("0");
     }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+3;
vector<int>G[maxn];
bool vis[maxn];
int du[maxn];
void dfs(int u){
     vis[u]=true;
     for(int i=0;i<G[u].size();i++){
        int to=G[u][i];
        if(!vis[to]){
            dfs(to);
        }
     }
}
int main()
{    int m,n,a,b;
     while(~scanf("%d",&m)){
          if(m==0)break;
          scanf("%d",&n);
          for(int i=0;i<maxn;i++)
              G[i].clear();
          memset(vis,false,sizeof(vis));
          memset(du,0,sizeof(du));
          for(int i=0;i<n;i++){
              scanf("%d%d",&a,&b);
             G[a].push_back(b);
             G[b].push_back(a);
             du[a]++;du[b]++;
          }
          bool flag=true;
          dfs(1);
          for(int i=1;i<=m;i++){
              if(!vis[i]) flag=false;
          }
          for(int i=1;i<=m;i++){
              if(du[i]&1)
                flag=false;
          }
          if(flag)
            puts("1");
          else
            puts("0");
     }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值