首页 > 代码库 > HDU 1116
HDU 1116
http://acm.hdu.edu.cn/showproblem.php?pid=1116
判断有向图欧拉回路和欧拉通路
有向图:
欧拉回路:图联通,所有顶点出度等于入度(通过图中每条边且只通过一次,并且经过每一顶点的回路。)
欧拉通路:图联通,除起点终点所有顶点出度等于入度,起点的出度-入度=1,终点的入度-出度=1(通过图中每条边且只通过一次,并且经过每一顶点的通路。)
图联通均用并查集判断
#include <iostream>#include <cstdio>#include <cstring>using namespace std ;int idx[100005] ;int find(int x){ return idx[x]==x?x:idx[x]=find(idx[x]) ;}int IN[100005],OUT[100005] ;char s[100005] ;int main(){ int t ; scanf("%d",&t) ; while(t--) { int n ; scanf("%d",&n) ; memset(IN,0,sizeof(IN)) ; memset(OUT,0,sizeof(OUT)) ; for(int i=0 ;i<26 ;i++) idx[i]=i ; int flag[30] ; memset(flag,0,sizeof(flag)) ; for(int i=0 ;i<n ;i++) { scanf("%s",s) ; int x=s[0]-‘a‘ ; int y=s[strlen(s)-1]-‘a‘ ; int p=find(x) ; int q=find(y) ; if(p!=q) { idx[p]=q ; } flag[x]=flag[y]=1 ; IN[x]++ ; OUT[y]++ ; } int cnt=0 ; for(int i=0 ;i<26 ;i++) { if(flag[i] && find(i)==i)cnt++ ; } if(cnt!=1)puts("The door cannot be opened.") ; else { cnt=0 ; int ans[30] ; for(int i=0 ;i<26 ;i++) { if(flag[i] && IN[i]!=OUT[i]) { ans[cnt++]=i ; } } if(!cnt) { puts("Ordering is possible.") ; continue ; } if(cnt==2 && ((OUT[ans[0]]-IN[ans[0]]==1 && IN[ans[1]]-OUT[ans[1]]==1) || (OUT[ans[1]]-IN[ans[1]]==1 && IN[ans[0]]-OUT[ans[0]]==1))) puts("Ordering is possible.") ; else puts("The door cannot be opened.") ; } } return 0 ;}
HDU 1116
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。