POJ 1094 拓扑排序(dfs+删边)

来源:互联网 发布:淘宝企业店铺客服电话 编辑:程序博客网 时间:2024/05/16 19:11
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxn=1e5+5;const int maxm=105;vector<int> edge[maxn];int n,m,a,b,flag,now,in[maxm],in1[maxm];void init(){    memset(in,0,sizeof(in));    memset(in1,0,sizeof(in1));    for(int i=0;i<n;i++)        edge[i].clear();    flag=now=0;}void dfs(int num){    if(flag) return;    if(num==a) {flag=1;return;}    for(vector<int>::iterator it=edge[num].begin();it!=edge[num].end();it++)        dfs(*it);}void solve(){    queue<int> que,res;    for(int i=0;i<n;i++)        if(in[i]==0)        {            que.push(i);            res.push(i);            if(que.size()>1)                return;        }    while(que.size())    {        int num=que.front();        que.pop();        in[num]=-1;        for(vector<int>::iterator it=edge[num].begin();it!=edge[num].end();it++)        {            in[*it]--;            if(in[*it]==0)            {                que.push(*it);                res.push(*it);                if(que.size()>1)                    return;            }        }    }    sort(in,in+n);    if(in[n-1]==-1)    {        flag=1;        printf("Sorted sequence determined after %d relations: ",now);        while(res.size())        {            printf("%c",res.front()+'A');            res.pop();        }        printf(".\n");    }}int main(){    char s[5];    while(scanf("%d%d",&n,&m)!=EOF&&(n||m))    {        init();        for(int i=1;i<=m;i++)        {            scanf("%s",s);            if(flag) continue;            a=s[0]-'A';            b=s[2]-'A';            dfs(b);            if(flag)            {                printf("Inconsistency found after %d relations.\n",i);                continue;            }            edge[a].push_back(b);            in[b]++;            in1[b]++;            now=i;            solve();            if(flag) continue;            for(int i=0;i<n;i++)                in[i]=in1[i];        }        if(!flag)            printf("Sorted sequence cannot be determined.\n");    }    return 0;}

0 0
原创粉丝点击