題意不太好理解....大致上: 是從某個指定的房間出發...問能否回到0房間...並且關掉圖中所有的門..而門是關上後無法開啟的...
輸入比較奇葩..我是gets讀入一行後再處理的...
再抽象一些...把門開作邊..那麼相當於找一條路徑..使得便利所有的邊..且每個邊只遍曆一次...這裡分為兩種情況..一種是從0出發..走完所有的邊回到0...這是典型的歐拉迴路...另一種是從其他點出發..到達0點..並且走完所有的邊..
判斷一個圖能否存在歐拉迴路..就是看所有點的度是否為偶數...因為所有的點必定都是進入多少次就要出去多少次...而只是一條路路徑而非迴路..那麼起點和終點必須是奇數的度..而其他的點的度必須為偶數...
Program:
#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<map>#include<queue>#include<stack>#define ll long long#define oo 1000000000#define pi acos(-1)using namespace std; int m,n,ans,a[105];char s[505];int main(){ int p,len,i,k; while (~scanf("%s",s)) { if (s[0]!='S') break; scanf("%d%d",&m,&n); gets(s); memset(a,0,sizeof(a)); ans=0; for (p=0;p<n;p++) { gets(s); len=strlen(s); i=0; while (i<len) { k=0; while (s[i]>='0' && s[i]<='9') { k=k*10+s[i]-'0'; i++; } if (k) { a[p]++; a[k]++; ans++; k=0; } i++; } } gets(s); k=0; for (i=0;i<n;i++) if (a[i]%2) k++; if (!m) { if (!k) printf("YES %d\n",ans); else printf("NO\n"); }else { if (k==2 && a[m]%2 && a[0]%2) printf("YES %d\n",ans); else printf("NO\n"); } } return 0;}