这个题就是想要练一下TOPO图的排序,可是一直对题意有误差,最后在discuss里看得到了灵感,,,,逻辑顺序很重要啊,
做了几个小时,,值得表扬,,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdlib>
using namespace std;
#define N 27
int n,m;
int tt;
int map[N][N];
int c[N];
int topo[N];
int t;
int ans=0;
int pre[N][N];
int d[N];
queue<int> q;
bool dfs(int u)
{
// printf("%c",u+'A');
c[u]=-1;
q.push(u);
for (int v=0;v<n;v++) if (map[u][v])
{
// cout<<u<<' '<<v<<endl;
if (c[v]<0)
{
return false;
}
else if (!c[v]&&!dfs(v))
return false;
}
q.pop();
c[u]=1;
topo[--t]=u;
return true;
}
bool toposort()
{
t=n;
//for (tt=2;tt<=m;tt++)
{
memset(c,0,sizeof(c));
//cout<<tt<<endl;
for (int u=0;u<n;u++)
{
if (!c[u])
if (!dfs(u))
{
return false;
}
//cout<<endl;
}
}
return true;
}
int main()
{
freopen("fuck.txt","r",stdin);
int i,j,k;
while (cin>>n>>m,n)
{
//cout<<n<<endl;
char a,b;
memset(map,0,sizeof(map));
//memset(d,0,sizeof(d));
memset(pre,-1,sizeof(pre));
j=1;
tt=2;
k=m;
int flag=0;
for (m=1;m<=k;m++) //这里就是要输入一个字符串就要判断一次,不然逻辑上很复杂.易出错.
{
cin>>a>>b>>b;
if (flag)
continue;
//cout<<m<<endl;
map[a-'A'][b-'A']=1;
d[a-'A']=1;
d[b-'A']=1;
if (pre[a-'A'][b-'A']==-1)
pre[a-'A'][b-'A']=j; //这里没有用,,是刚开始的时候想的.
j++;
if (toposort()) //没有回路
{
if (t) //多余
continue;
for (i=0;i<n-1;i++) //判断是否唯一,,,自己临时想出的哦,鼓掌
{
if (!map[topo[i]][topo[i+1]])
break;
}
if (i<n-1)
continue;
//cout<<" "<<i<<endl;
flag=1;
printf("Sorted sequence determined after %d relations: ",m);
for (i=0;i<n;i++)
{
printf("%c",'A'+topo[i]);
}
printf(".\n");
}
else //有回路时输出
{
flag=1;
printf("Inconsistency found after %d relations.\n",m);
}
//cout<<map['L'-'A']['H'-'A']<<endl;
}
if (!flag)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}
Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20160 | Accepted: 6914 |
Description
An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.
Input
Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.
Output
For each problem instance, output consists of one line. This line should be one of the following three:
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
Sample Input
4 6 A<B A<C B<C C<D B<D A<B 3 2 A<B B<A 26 1 A<Z 0 0
Sample Output
Sorted sequence determined after 4 relations: ABCD. Inconsistency found after 2 relations. Sorted sequence cannot be determined.
Source