#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
const int maxm=105;
vector<int> edge[maxn];
int n,m,a,b,flag,now,in[maxm],in1[maxm];
void init()
{
memset(in,0,sizeof(in));
memset(in1,0,sizeof(in1));
for(int i=0;i<n;i++)
edge[i].clear();
flag=now=0;
}
void dfs(int num)
{
if(flag) return;
if(num==a) {flag=1;return;}
for(vector<int>::iterator it=edge[num].begin();it!=edge[num].end();it++)
dfs(*it);
}
void solve()
{
queue<int> que,res;
for(int i=0;i<n;i++)
if(in[i]==0)
{
que.push(i);
res.push(i);
if(que.size()>1)
return;
}
while(que.size())
{
int num=que.front();
que.pop();
in[num]=-1;
for(vector<int>::iterator it=edge[num].begin();it!=edge[num].end();it++)
{
in[*it]--;
if(in[*it]==0)
{
que.push(*it);
res.push(*it);
if(que.size()>1)
return;
}
}
}
sort(in,in+n);
if(in[n-1]==-1)
{
flag=1;
printf("Sorted sequence determined after %d relations: ",now);
while(res.size())
{
printf("%c",res.front()+'A');
res.pop();
}
printf(".\n");
}
}
int main()
{
char s[5];
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
init();
for(int i=1;i<=m;i++)
{
scanf("%s",s);
if(flag) continue;
a=s[0]-'A';
b=s[2]-'A';
dfs(b);
if(flag)
{
printf("Inconsistency found after %d relations.\n",i);
continue;
}
edge[a].push_back(b);
in[b]++;
in1[b]++;
now=i;
solve();
if(flag) continue;
for(int i=0;i<n;i++)
in[i]=in1[i];
}
if(!flag)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}
POJ 1094 拓扑排序(dfs+删边)
最新推荐文章于 2024-08-29 09:43:20 发布