這題很基礎也很經典,不過個人認為有一個非常容易出錯的地方,就是矛盾Inconsistency的優先順序比不確定的優先順序高,因為當前有矛盾就立即跳出,而當前有多個點入度為0就不能立即輸出,有可能後來加入的線段可以確定唯一答案,就像一樣。。。很陰險!wa了幾次才得以ac。原本想用隊列,但是不好搞
#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}#define LL long long#define PI acos(-1.0)#define N 1000010#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)int g[30][30];string order;int n,m;int ans;int in[30];int vis[30];queue<int> q;int cnt[30];int topsort(){ int i,j,k; order.clear(); memcpy(cnt,in,sizeof(cnt)); int flag=0; for(i=1;i<=n;i++){ int num=0,pos; for(j=1;j<=n;j++) if(cnt[j]==0) {pos=j;num++;} if(!num) return 0; if(num>1) flag=1; //這裡!!!不能立即跳出,因為後面接下來有可能矛盾 cnt[pos]=-1; order+=pos-1+'A'; for(j=1;j<=n;j++) if(g[pos][j]) cnt[j]--; } if(flag)return 2; return 1;}/* for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(g[i][j]){ in[j]++; vis[i]=1; vis[j]=1; } for(i=1;i<=n;i++) if(in[i]==0 && vis[i]) q.push(i); if(q.size()==0) {return 0;} if(q.size()>1) {return 2;} while(!q.empty()){ int x=q.front(); q.pop(); order+=(x+'A'-1); for(i=1;i<=n;i++){ if(g[x][i]) { in[i]--; if(in[i]==0) q.push(i); } } if(q.size()>1)return 2; } if(order.size()==n) return 1; return 2;*/int main(){ while(scanf("%d%d",&n,&m) && (n+m)){ int i,j,k; for(i=0;i<=n;i++) for(j=0;j<=n;j++) {g[i][j]=g[j][i]=0;in[i]=0;} int tag=0; char str[4]; for(i=1;i<=m;i++){ scanf("%s",str); if(tag)continue; int a=str[0]-'A'+1,b=str[2]-'A'+1; g[a][b]=1; in[b]++; ans=topsort(); if(ans==0){ printf("Inconsistency found after %d relations.\n",i); tag=1; } if(ans==1){ printf("Sorted sequence determined after %d relations: ",i); cout<<order<<".\n"; tag=1; } } if(!tag) puts("Sorted sequence cannot be determined."); } return 0;}