1. 程式人生 > >歐拉回路【判斷連通+度數為偶】

歐拉回路【判斷連通+度數為偶】

* 無向圖是尤拉圖的充要條件是所有點的度為偶數並且所有點聯通*

解決是否為偶數很簡單,問題似乎變成了判斷連通呢?
1.並查集
2.深搜一下就好了

並查集:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std; #define LL long long const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; #define exp 1e-6 const int N=1e4+10; int pre[N]; int ma[N][N]; int d[N]; bool vis[N]; int Find(int x) { int r=x; while(r!=pre[r]) r=pre[r]; int i=x,j; while(pre[i]!=r) { j=pre[i]; pre[i]=r; i=j; } return
r; } int main() { int tep,aa,bb,a,b,n,m; while(~scanf("%d",&n)&&n) { scanf("%d",&m); for(int i=1;i<=n;i++) pre[i]=i; memset(d,0,sizeof(d)); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); d[a]++; d[b]++; aa=Find(a); bb=Find(b); if
(aa!=bb) pre[aa]=bb; } /* for(int i=1;i<=n;i++) printf("%d ",d[i]); puts("");*/ tep=Find(1); int flag=0; for(int i=1;i<=n;i++) { if(d[i]%2||Find(i)!=tep){ flag=1;break; } } if(flag) puts("0"); else puts("1"); } return 0; }

深搜:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
#define exp 1e-6

const int N=1e3+10;

int pre[N];
int ma[N][N];
int d[N];
bool vis[N];
int flag,n;

void DFS(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(!vis[i]&&ma[x][i])
        {
            vis[i]=1;
            DFS(i);
        }
    }
}

int main()
{
    int tep,aa,bb,a,b,m;
    while(~scanf("%d",&n)&&n)
    {
        scanf("%d",&m);
        for(int i=1;i<=n;i++)
            pre[i]=i;
        memset(d,0,sizeof(d));
        memset(ma,0,sizeof(ma));
        memset(vis,0,sizeof(vis));

        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            d[a]++;
            d[b]++;
            ma[a][b]=ma[b][a]=1;
        }
        flag=0;
        vis[1]=1;
        DFS(1);
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                flag=1;break;
            }
        }

        for(int i=1;i<=n;i++)
        {
            if(d[i]%2){
                flag=1;break;
            }
        }
        if(flag)
            puts("0");
        else
            puts("1");
    }
    return 0; 
}