【基礎拓撲排序】poj 1094

來源:互聯網
上載者:User

這題很基礎也很經典,不過個人認為有一個非常容易出錯的地方,就是矛盾Inconsistency的優先順序比不確定的優先順序高,因為當前有矛盾就立即跳出,而當前有多個點入度為0就不能立即輸出,有可能後來加入的線段可以確定唯一答案,就像一樣。。。很陰險!wa了幾次才得以ac。原本想用隊列,但是不好搞

#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}#define LL long long#define PI acos(-1.0)#define N  1000010#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)int g[30][30];string order;int n,m;int ans;int in[30];int vis[30];queue<int> q;int cnt[30];int topsort(){    int i,j,k;    order.clear();    memcpy(cnt,in,sizeof(cnt));    int flag=0;    for(i=1;i<=n;i++){        int num=0,pos;        for(j=1;j<=n;j++)            if(cnt[j]==0)               {pos=j;num++;}        if(!num) return 0;        if(num>1) flag=1;           //這裡!!!不能立即跳出,因為後面接下來有可能矛盾        cnt[pos]=-1;        order+=pos-1+'A';        for(j=1;j<=n;j++)        if(g[pos][j])        cnt[j]--;    }    if(flag)return 2;    return 1;}/*    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            if(g[i][j]){                in[j]++;                vis[i]=1;                vis[j]=1;                }    for(i=1;i<=n;i++)        if(in[i]==0 && vis[i])            q.push(i);    if(q.size()==0) {return 0;}    if(q.size()>1) {return 2;}    while(!q.empty()){        int x=q.front();        q.pop();        order+=(x+'A'-1);        for(i=1;i<=n;i++){            if(g[x][i])                {                    in[i]--;                    if(in[i]==0)                        q.push(i);                }        }        if(q.size()>1)return 2;    }    if(order.size()==n) return 1;    return 2;*/int main(){    while(scanf("%d%d",&n,&m) && (n+m)){        int i,j,k;        for(i=0;i<=n;i++)            for(j=0;j<=n;j++)                {g[i][j]=g[j][i]=0;in[i]=0;}        int tag=0;        char str[4];        for(i=1;i<=m;i++){            scanf("%s",str);            if(tag)continue;            int a=str[0]-'A'+1,b=str[2]-'A'+1;            g[a][b]=1;            in[b]++;            ans=topsort();            if(ans==0){                printf("Inconsistency found after %d relations.\n",i);                tag=1;            }            if(ans==1){                printf("Sorted sequence determined after %d relations: ",i);                cout<<order<<".\n";                tag=1;            }        }        if(!tag)            puts("Sorted sequence cannot be determined.");    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.