标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 29359 | Accepted: 10170 | 
Description
Input
Output
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.
#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <cmath>
#include <queue>
#include <stack>
#define N 1009
using namespace std;
char s[N];
int mp[27][27];
int q[N];
int deg[N];
int topo(int n)
{
    int c=0,temp[27],m,loc,flag=1;
    for(int i=1;i<=n;i++)
    temp[i]=deg[i];
    for(int i=1;i<=n;i++)
    {
        m=0;
        for(int j=1;j<=n;j++)
        if(temp[j]==0)
        {
            m++;
            loc=j;
        }
        if(m==0)
        return 0;//有环
        if(m>1)
        flag=-1;//无环
        q[c++]=loc;
        temp[loc]=-1;
        for(int j=1;j<=n;j++)
        if(mp[loc][j]==1)
        temp[j]--;
    }
   return flag;
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&m,&n))
    {
        if(n==0 && m==0) break;
        memset(mp,0,sizeof mp);
        memset(deg,0,sizeof deg);
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            if(flag) continue;
            int a=s[0]-'A'+1;
            int b=s[2]-'A'+1;
            mp[a][b]=1;
            deg[b]++;
            int ans=topo(m);
            if(ans==0)
            {
                cout<<"Inconsistency found after "<<i<<" relations."<<endl;
                flag=1;
            }
            if(ans==1)
            {
                cout<<"Sorted sequence determined after "<<i<<" relations: ";
                for(int j=0;j<m;j++)
                printf("%c",q[j]-1+'A');
                cout<<".\n";
                flag=1;
            }
        }
        if(flag==0)
        cout<<"Sorted sequence cannot be determined."<<endl;
    }
    return 0;
}
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/45585669