[拓扑排序]POJ 1094

题目链接

因为题目问到了具体到哪一步排序完成了,或者出现了什么问题;所以每多增加一个字符串,就要重新进行一个拓扑排序,来判断这步操作是否可以得出答案;

#include <bits/stdc++.h>
using namespace std;
vector<int> vec[30];
int rudu[30];
queue<int> que;
queue<int> res;
int n,m;
int unsure;
int in[30];
int topsort()
{
    while(!que.empty()) que.pop();
    while(!res.empty()) res.pop();
    for(int i=1;i<=n;i++) in[i]=rudu[i];//复制节点度数,但是本身节点度数要存下来;
    for(int i=1;i<=n;i++){
        if(in[i]==0){
            que.push(i);
        }
    }
    //cout<<que.size()<<" s dfsaf";
    //cout<<"asdadas";
    unsure=1;
    while(!que.empty())
    {
        if(que.size()>1) unsure=-1;//不确定顺序;
        int fr=que.front();
        que.pop();
        res.push(fr);
        //printf("%c",fr+'A'-1);
        for(int i=0;i<vec[fr].size();i++){
            in[vec[fr][i]]--;
            if(in[vec[fr][i]]==0)
                //cout<<vec[fr][i]<<" ",
                que.push(vec[fr][i]);
        }
    }
    //cout<<"res="<<res.size()<<endl;
    if(res.size()!=n) return 0;//形成了环
    return unsure;
}

int main()
{
    while(cin>>n>>m&&n&&m)
    {
        string tmp;
        while(!res.empty()) res.pop();
        while(!que.empty()) que.pop();
        for(int i=1;i<=n;i++){
            vec[i].clear();
        }
        memset(rudu,0,sizeof(rudu));
//        memset(flag,0,sizeof(flag));
        int sign=0;
        unsure=0;
        for(int i=1;i<=m;i++){
            cin>>tmp;
            vec[tmp[0]-'A'+1].push_back(tmp[2]-'A'+1);
            rudu[tmp[2]-'A'+1]++;
            if(sign) continue;
            int k=topsort();
            if(k==0){
                sign=1;
                printf("Inconsistency found after %d relations.\n",i);
            }
            if(k==1){
                printf("Sorted sequence determined after %d relations: ",i);
                while(!res.empty()){
                    int fr=res.front();
                    res.pop();
                    printf("%c",fr+'A'-1);
                    sign=1;
                }
                printf(".\n");
            }
        }
        if(!sign) printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44833767/article/details/104090483