poj1386(判断一个有向图是否存在欧拉回路)

1.欧拉回路:定义:经过图(有向图或无向图)中每条边一次且仅一次并且行遍图中每个顶点的回路( 闭合的欧拉路径,即一个环,保证每条边都通过且仅通过一次)
2.问题2:判断一个图是否有欧拉路径:
(1)图G是连通的,无孤立的点
(2)有向图每个点的入度等于出度
(3)有向图,可以存在两个点,其入度不等于出度,其中一个入度比出度大一,为路径的起点;另一个出度不入度大一,为路径的终点

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
using namespace std;
const int maxx=5005;
const int inf=0x3f3f3f3f;
int indegree[maxx];
int vis[maxx];
int outdegree[maxx];
int n,m;
int cnt;
int mark;
char s[maxx];
vector<int>G[maxx];
void init(){
	cnt=0;
	mark=0;
	m=0;
	memset(indegree,0,sizeof(indegree));
	memset(outdegree,0,sizeof(outdegree));
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=66;i++){
		G[i].clear();
	}
}
void dfs(int u){
	vis[u]=1;
	cnt++;
	if(cnt==m&&mark==0){
		mark=1;
		return ;
	}
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(vis[v]==0){
			dfs(v);
		}
	}
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		init();
		int visited[maxx];
		memset(visited,0,sizeof(visited));
		for(int i=1;i<=n;i++){
			scanf("%s",&s);
			int a=s[0]-'a'+1;
			int b=s[strlen(s)-1]-'a'+1;
			G[a].push_back(b);
			G[b].push_back(a);
			if(visited[a]==0){
				visited[a]=1;
				++m;
			}
			if(visited[b]==0){
				visited[b]=1;
				++m;
			}
			outdegree[a]++;
			indegree[b]++;
		}
		int index;
		for(index=1; index<=66; ++index) {
			if(!G[index].empty()) {
				break;
			}
		}
		dfs(index);
		if(mark==0){
			cout<<"The door cannot be opened."<<endl;
			continue;
		}
		int flag=1;
		int ans1=0,ans2=0;
		for(int i=1;i<=27;i++){
			if(indegree[i]==outdegree[i]){
				continue;
			}else if(indegree[i]-outdegree[i]==1&&ans1==0){
				ans1=1;
			}else if(outdegree[i]-indegree[i]==1&&ans2==0){
				ans2=1;
			}else{
				flag=0;
				break;
			}
		}
		if(mark==1&&flag==1){
			cout<<"Ordering is possible."<<endl;
		}else{
			cout<<"The door cannot be opened."<<endl;
		}
	}
	return 0;
}
上一篇:菊厂笔试3


下一篇:《剑指offer》第2章 03-15题解