1. 程式人生 > >【poj 1094 Sorting It All Out 】(拓撲排序判環 + 判唯一性)

【poj 1094 Sorting It All Out 】(拓撲排序判環 + 判唯一性)

題意:n個編號,m中偏序關係,形如A<B,問是否存在唯一的拓撲序列並且給出在第幾組關係確定的。
分析: 拓撲排序判環 + 判唯一性
本題特別的地方在 第幾組能夠確定唯一的拓撲序列,所以每輸入一組關係,需呼叫拓撲排序一次,若確定了存在唯一序列或者存在環,即可不再呼叫。
若直到輸入完畢也不能確定,輸出對應答案。
步驟:
1.存在環或者確定唯一序列,結束
2.不能確定是步驟1的情形,一直呼叫拓撲排序

程式碼:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <set> #include <bitset> #include <cctype> #include <cstdlib> #include <queue> #include <cmath> #include <stack> #include <ctime> #include <string> #include <vector> #include <sstream> #include <algorithm> using namespace
std; #define mem(a,n) memset(a,n,sizeof(a)) #define memc(a,b) memcpy(a,b,sizeof(b)) #define rep(i,a,n) for(int i=a;i<n;i++) #define pb push_back #define IO ios::sync_with_stdio(false) #define fre freopen("in.txt","r",stdin) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long
long ll; const double PI=acos(-1.0); const double eps=1e-8; const int INF=0x3f3f3f3f; const int MOD=1e8; const int N=30; const ll maxn=1LL<<60; const int dir[4][2]= {-1,0,1,0,0,-1,0,1}; int n,m; vector<int>g[N]; //bool g[N][N]; char ans[N]; int deg[N],num; int in[N]; ///初始化 void init() { num=0; mem(deg,0); mem(in,0); rep(i,0,n+1) g[i].clear(); } /// 拓撲排序 int toposort() { ///puts("AA"); queue<int>que; mem(ans,0); memc(in,deg);///多次使用拓撲排序,in[]為輔助陣列 int flag=1,cnt=0; rep(i,1,n+1) if(!in[i]) que.push(i); while(!que.empty()) { if(que.size()>1) flag=0;///當前入度為0的點多於1個,說明序列不確定 int u=que.front(); que.pop(); ans[cnt++]=u+'A'-1;///儲存序列 rep(i,0,g[u].size()) { int v=g[u][i]; in[v]--; if(!in[v]) que.push(v); } } //printf("flag=%d cnt=%d n=%d\n",flag,cnt,n); if(flag==1 && cnt==n) return 1;///每次入隊只有一個點且序列全部生成,則確定 else { rep(i,1,n+1) if(in[i]) return 2;///存在環 return 0;///不存在環,且未生成序列 } } int main() { //fre; while(~scanf("%d %d",&n,&m)&&n+m) { init(); int can=0,id=-1; rep(i,0,m) { getchar(); char ch1,ch2; scanf("%c<%c",&ch1,&ch2); if(can) continue; int u=ch1-'A'+1,v=ch2-'A'+1; //printf("u=%d v=%d\n",u,v); g[u].pb(v); deg[v]++; if(!can) can=toposort(); if(id==-1 && can) id=i+1; //printf("can=%d\n",can); // puts("BB"); } if(!can) printf("Sorted sequence cannot be determined.\n"); else if(can==1) printf("Sorted sequence determined after %d relations: %s.\n",id,ans); else printf("Inconsistency found after %d relations.\n",id); } return 0; }