poj1386判尤拉路
阿新 • • 發佈:2019-02-05
歐拉回路:圖G,若存在一條路,經過G中每條邊有且僅有一次,稱這條路為尤拉路,如果存在一條迴路經過G每條邊有且僅有一次,
稱這條迴路為歐拉回路。具有歐拉回路的圖成為尤拉圖。
判斷尤拉路是否存在的方法
有向圖:圖連通,有一個頂點出度大入度1,有一個頂點入度大出度1,其餘都是出度=入度。
無向圖:圖連通,只有兩個頂點是奇數度,其餘都是偶數度的。
判斷歐拉回路是否存在的方法
有向圖:圖連通,所有的頂點出度=入度。
無向圖:圖連通,所有頂點都是偶數度。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef struct { int in,out; }GRAPH; char ch[1010]; int g[30][30];//init int vis[30]; int linked,n; void dfs(int v) { vis[v]=1; for(int i=0;i<26;i++) if(!vis[i]&&g[v][i]) dfs(i); linked++; } int main() { int t,i,j; GRAPH degree[30]; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(g,0,sizeof(g)); memset(vis,0,sizeof(vis)); memset(degree,0,sizeof(degree)); for(i=0;i<n;i++) { scanf("%s",ch); int len=strlen(ch); int a=ch[0]-'a'; int b=ch[len-1]-'a'; degree[a].out++; degree[b].in++; g[a][b]=g[b][a]=1; } int first=0,np=0; for(i=0;i<30;i++) if(degree[i].in||degree[i].out) { if(!first) first=i; np++; } linked=0; dfs(first); //cout<<"linked="<<linked<<endl; if(linked!=np) { puts("The door cannot be opened."); continue; } int nt=0,ne=0,na=0,nb=0; for(i=0;i<30;i++) { if(degree[i].in==0&°ree[i].out==0) continue; nt++; if(degree[i].in==degree[i].out) ne++; else if(degree[i].in-degree[i].out==1) na++; else if(degree[i].in-degree[i].out==-1) nb++; } //cout<<na<<" "<<nb<<" "<<ne<<" "<<nt<<endl; if(na==1&&nb==1&&ne==nt-2||ne==nt) { puts("Ordering is possible."); } else { puts("The door cannot be opened."); } } return 0; }