poj 1094
唉 这几天有点热 有点烦躁 以后能做成什么样。。。。
题意:给定n个字母《0+A,...n+A》 和m个关系 想x>y 问是否能唯一确定他们的大小关系
1 在第几个关系能确定他们的排序 就输出这个位置和排序
2 如果出现矛盾就输出矛盾的位置
3 整个关系输入之后还不能确定则输出不能确定关系
#include<iostream>
#include<cstring>
using namespace std;
int map[55][55];
int in[55];
int jie[55];
int n;
int sort()//1 不能排序 ; 2 能排序
{
int ji[55];
int f=2;
// memset(s,0,sizeof(s));
int i,j;
int x,sum;
for(i=1;i<=n;i++)
ji[i]=in[i];
for(i=1;i<=n;i++)
{
sum=0;
for(j=1;j<=n;j++)
if(ji[j]==0)
{
sum++;
x=j;
}
if(sum==0) return 1; //是否有环
if(sum>1) f=0;
jie[i]=x;
ji[x]=-1;
for(j=1;j<=n;j++)
if(map[x][j])
ji[j]--;
}
return f;
}
int main()
{
int yes,i;
char s[11];
int m;
while(cin>>n>>m)
{
yes=0;
if(n==0&&m==0)
break;
memset(in,0,sizeof(in));
memset(map,0,sizeof(map));
for(i=1;i<=m;i++)
{
cin>>s;
if(yes) continue;
int u=s[0]-'A'+1;
int v=s[2]-'A'+1;
if(s[1]=='<')
{
if(map[v][u])
{
cout<<"Inconsistency found after "<<i<<" relations."<<endl;
yes=1;
continue;
}
map[u][v]=1;
in[v]++;
}
else
{
if(map[u][v])
{
cout<<"Inconsistency found after "<<i<<" relations."<<endl;
yes=1;
continue;
}
map[v][u]=1;
in[u]++;
}
int x=sort();
if(x==1)
{ cout<<"Inconsistency found after "<<i<<" relations."<<endl;
yes=1;
continue;
}
if(x==2)
{
cout<<"Sorted sequence determined after "<<i<<" relations: ";
for(int j=1;j<=n;j++)
cout<<(char)(jie[j]-1+'A');
cout<<'.'<<endl;
yes=1;
}
}
if(!yes)
cout<<"Sorted sequence cannot be determined."<<endl;
}
return 0;
}

浙公网安备 33010602011771号