POJ 1094拓补排序问题,需要加一些判断
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdlib>
using namespace std;
queue<int> q;
vector<int> edge[30];
int in[30];
vector<int> ans;
int n,m;
void init()
{
memset(edge,0,sizeof(edge));
memset(in,0,sizeof(in));
while(!q.empty())
q.pop();
}
int tp()
{
while(!q.empty())
q.pop();
bool unsure=false;
for(int i=0;i<n;i++)
if(in[i]==0)
q.push(i);
while(!q.empty())
{
int tmp=q.front();
if(q.size()>1)
unsure=true;
q.pop();
ans.push_back(tmp);
for(int i=0;i<edge[tmp].size();i++)
{
in[edge[tmp][i]]--;
if(in[edge[tmp][i]]==0)
q.push(edge[tmp][i]);
}
}
if(n>ans.size()) return 2;
else if(unsure) return 3;
else return 1;
}
int main()
{
while(scanf("%d%d",&n,&m))
{
init();
if(m==n&&m==0)
break;
bool ft=false;
int step,flag=3;
for(int i=1;i<=m;i++)
{
char opt[5];
scanf("%s",opt);
int tmp[30];
if(ft)
continue;
int fr=(int)opt[0]-'A',t=(int)opt[2]-'A';
bool fff=false;
for(int j=0;j<edge[fr].size();j++)
if(edge[fr][j]==t)
fff=true;
if(!fff)
{
in[t]++;
edge[fr].push_back(t);
}
while(!ans.empty())
ans.pop_back();
memcpy(tmp,in,sizeof(in));
flag=tp();
memcpy(in,tmp,sizeof(tmp));
if(flag!=3)
{
ft=true;
step=i;
}
}
if(flag==1)
{
printf("Sorted sequence determined after %d relations: ",step);
for(int i=0;i<ans.size();i++)
printf("%c",ans[i]+'A');
printf(".\n");
}
else if(flag==2)
printf("Inconsistency found after %d relations.\n",step);
else if(flag==3)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}