判图的连通性(dfs,并查集)


一.无向图

欧拉回路:每个顶点度数都是偶数

欧拉路:所有点度数为偶数,或者只有2个点度数为奇数

当然判连通性


hdu 1878 欧拉回路 两种判连通的方法


dfs


#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define N 1010
int degree[N],n,m;
bool visit[N];
vector<int>edge[N];
void dfs(int point){
	int i,j,p;
	visit[point]=1;
	for(i=0;i<edge[point].size();i++){
		p=edge[point][i];
		if(!visit[p])
			dfs(p);
	}
}
int main(int argc, char** argv) {
	int i,j,a,b;
	while(scanf("%d",&n)!=EOF&&n){
		scanf("%d",&m);
		for(i=1;i<=n;i++){
			degree[i]=0;
			edge[i].clear();
		}
		for(i=0;i<m;i++){
			scanf("%d%d",&a,&b);
			if(a!=b){
				edge[a].push_back(b);
				edge[b].push_back(a);
				degree[a]++;
				degree[b]++;
			}
		}
		bool flag=0;
		for(i=1;i<=n;i++){
			if(degree[i]&1){
				printf("0\n");
				flag=1;
				break;
			}
		}
		if(flag)
			continue;
		memset(visit,0,sizeof(visit));
		dfs(1);
		for(i=1;i<=n;i++){
			if(!visit[i]){
				flag=1;
				break;
			}
		}
		if(flag)
			printf("0\n");
		else
			printf("1\n");
		
	}
	return 0;
}


并查集:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define N 1010
int degree[N],n,m;
vector<int>edge[N];
int father[N];
int find(int x){
	while(x!=father[x])
		x=father[x];
	return x;
}
void unite(int a,int b){
	father[b]=find(a);
}
int main(int argc, char** argv) {
    int i,j,a,b;
    while(scanf("%d",&n)!=EOF&&n){
        scanf("%d",&m);
        for(i=1;i<=n;i++){
            degree[i]=0;
            edge[i].clear();
            father[i]=i;
        }
        for(i=0;i<m;i++){
            scanf("%d%d",&a,&b);
            if(a!=b){
                edge[a].push_back(b);
                edge[b].push_back(a);
                degree[a]++;
                degree[b]++;
                if(find(a)!=find(b))
                	unite(a,b);
            }
        }
        bool flag=0;
        for(i=1;i<=n;i++){
            if(degree[i]&1){
                printf("0\n");
                flag=1;
                break;
            }
        }
        if(flag)
            continue;
        int x=father[1];
        for(i=2;i<=n;i++){
        	if(find(i)!=x){
        		flag=1;
        		break;
        	}
        }
        if(flag)
        	printf("0\n");
        else
        	printf("1\n");
    }
}






posted @ 2014-01-22 18:03  Teemo的技术blog  阅读(358)  评论(0编辑  收藏  举报