xiaonanan哈密顿回路篇

2018-09-25  本文已影响12人  _弓长_大人

杭电 3018
father[fa]=fb,写成father[a]=fb;
难受,是真的难受
弄错了,搞了我几个小时,还是对并查集不熟悉 呀,时刻告诫自己心态不要崩。
考察点: 一笔画 问题 对于 全是偶度点的连通图可以 一笔画
对于 存在N个奇度点的连通图可以 画 N/2 笔

孤立点不算

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
using namespace std;
int father[100005],du[100005];
int ji[100005];
bool vis[100005];
//寻找父亲节点
int findf(int x)
{
    if(x!=father[x])
    {
        father[x]=findf(father[x]);
    }
    return father[x];
}
int main()
{
    int n,m,fa,fb,i;
    int ans=0;
    int a,b;
    int fat;
    vector<int>ff;
    int vv;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
       ff.clear();
       ans=0;
       for(i=1;i<=n;i++)
       {
         vis[i]=false;
         du[i]=0;
         ji[i]=0;
         father[i]=i;
       }
       for(i=0;i<m;i++)
       {
           scanf("%d%d",&a,&b);
           du[a]++;
           du[b]++;
           fa=findf(a);
           fb=findf(b);
           if(fa!=fb)
           {
            father[fa]=fb;
           }
       }

       for(i=1;i<=n;i++)
       {
         fat=findf(i);
        if(!vis[fat])
        {
            vis[fat]=true;
            ff.push_back(fat);
        }
        if(du[i]&1)
        {
           ji[fat]++;
        }
       }
       for(i=0;i<ff.size();i++)
       { vv=ff[i];
           if(du[vv]==0)
            continue;
            if(ji[vv]==0)
            ans++;
           else
           {
              ans+=(ji[vv]/2);
           }
       }
       printf("%d\n",ans);
    }
    return 0;
}

杭电 3018
一个无向图 每个点至少与其他一半的点存在边,我刚开始没有判断没有哈密顿回路的情况,也是对的,应该题目的情况肯定存在哈密顿回路吧。

#include<bits/stdc++.h>
using namespace std;
int mapp[151][151];
bool vis[151];
int rd[151];
int n,m;
int cnt=0;
bool flag=false;
void dfs(int x,int num)
{
    rd[num]=x;
    vis[x]=true;
    if(num==(n))
    {
        if(mapp[1][x])
        flag=true;
        return;
    }
    for(int i=1;!flag&&i<=n;i++)
    {
        if(mapp[x][i]&&!vis[i]&&!flag)
        {
            dfs(i,num+1);
            vis[i]=false;
        }
    }
    return;
}
int main()
{
   while(~scanf("%d%d",&n,&m))
   {
       cnt=0;
       memset(mapp,0,sizeof(mapp));
       memset(vis,false,sizeof(vis));
       flag=false;
       for(int i=0;i<m;i++)
       {
           int a,b;
           scanf("%d%d",&a,&b);
           mapp[a][b]=1;
           mapp[b][a]=1;
       }
       dfs(1,1);
       if(flag)
       {
           for(int i=1;i<n;i++)
           {
               printf("%d ",rd[i]);
           }
            printf("%d\n",rd[n]);
       }
       else
       {
           printf("no solution\n");
       }
   }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读