思路:
bool check(){
for(int i=0;i<n;i++)
if(In[i]+Out[i]!=n-1) return 0;
return 1;
}
Out[a]++;In[b]++;
if(check()){
for(int st=0;st<n;st++)
if(In[st]==0){dfs(st,0);return;}
}
这样子的想法是错误的,确定唯一答案的条件是: 用已知条件形成的完整图,在该图中,每个节点的入读+出度==n-1 ;
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<map>
#include<set>
using namespace std;
int n,m,id;
int pos[40][40];
int e[40][40];
int In[40],Out[40],dep[40];
char str[100010][4];
char ans[40];
bool floy(){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
if(e[i][k]&&e[k][j]) e[i][j]=1;
for(int i=0;i<n;i++)
if(e[i][i]) return 1;
return 0;
}
bool check(){
memset(In,0,sizeof(In));
memset(Out,0,sizeof(Out));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(e[i][j]){
In[j]++;Out[i]++;
}
for(int i=0;i<n;i++)
if(In[i]+Out[i]!=n-1) return 0;
return 1;
}
void dfs(int cur,int num){
ans[num]=cur+'A';
if(num==n-1){
printf("Sorted sequence determined after %d relations: ",id);
for(int i=0;i<=num;i++) printf("%c",ans[i]);
printf(".\n");
}
dep[cur]--;
for(int i=0;i<n;i++)
if(pos[cur][i]) dep[i]--;
for(int i=0;i<n;i++)
if(dep[i]==0) dfs(i,num+1);
}
void deal(){
for(id=1;id<=m;id++){
int a=str[id][0]-'A';
int b=str[id][2]-'A';
e[a][b]=1;pos[a][b]=1;
if(floy()){
printf("Inconsistency found after %d relations.\n",id);
return ;
}
dep[b]++;
if(check()){
for(int st=0;st<n;st++)
if(dep[st]==0){dfs(st,0);return;}
}
}
printf("Sorted sequence cannot be determined.\n");
}
int main()
{
// freopen("in.in","r",stdin);
while(~scanf("%d%d",&n,&m)&&(n+m)){
memset(dep,0,sizeof(dep));
memset(e,0,sizeof(e));
memset(pos,0,sizeof(pos));
for(int i=1;i<=m;i++)
scanf("%s",&str[i]);
deal();
}
return 0;
}