poj1094-Sorting It All Out-拓撲排序

來源:互聯網
上載者:User

標籤:get   click   命令   ons   style   拓撲   ted   deb   html   

題意:

1).給你一些大寫字母,共n個;大寫字母間有m條關係;

2).舉例:關係:A<B,意思就是A要排在B的前面(也就是說可能B排在A的前面

3).輸出:有三種情況:

    1.n個字母在前 i 條關係下可以確定排序關係;

    2.n個字母在執行到第 i 條命令時出現錯誤,即迴路:A間接或直接小於B 且 B間接或直接小於A;

    3.m條命令不能確定n個字母的排序。

 

思路:

    直觀感覺就是拓撲排序,需要注意的是,每讀入一條命令就要拓撲排序一次。

    如果你對拓撲排序不夠瞭解,請看這篇部落格:點擊查看

    而三種情況判斷的順序更為重要!!

    情況1和2可以同時判斷,最後判斷情況3!!

    意思是:

        如果執行到第 i 條命令時,可以確定情況1 或2,則直接輸出;

        如果m條命令執行完了,還不能確定字母順序,則輸出情況3

 

題目連結:

  點擊做題

AC代碼:

#include<iostream>  #include<cstdio>  #include<cstring>  #include<algorithm>  #include<map>  #include<queue>  #include<set>  #include<string>  #include<stack>  #include<cmath>  #define test printf("***\n")  #define mm1(a) memset((a),-1,sizeof((a)))  #define mm0(a) memset((a),0,sizeof((a)))  #define mmx(a) memset((a),0x3f,sizeof((a)))  #define ka getchar();getchar()  #define ka1 getchar()  #define iis std::ios::sync_with_stdio(false)  using namespace std;  typedef long long LL;  typedef unsigned long long uLL;  const int N = 105;  const int M = 4100005;  const int X = 999983;  const int INF = 1e9;  const double eps = 1e-8;  const int mod = 1e9 + 7;  //#define DEBUG  int n,m,sum;  int tot,flag;  int in[N],head[N],tin[N];  int ar[N];  struct lp  {      int u,v,nex;      lp(){}      lp(int a,int b,int c):      u(a),v(b),nex(c){}  }cw[N*N];  inline void add(int a,int b){      cw[++tot]=lp(a,b,head[a]);      head[a]=tot;  }  int tuopu(){      queue<int>Q;      while(!Q.empty())Q.pop();      for(int i=0;i<=n;++i)tin[i]=in[i];      for(int i=1;i<=n;++i){          if(tin[i]==0){              Q.push(i);          }      }      int t=0;      int ans=0;      while(!Q.empty()){          if(Q.size()>1)ans=-1;          int u=Q.front();Q.pop();          ar[t++]=u;          for(int i=head[u];i!=-1;i=cw[i].nex){              int v=cw[i].v;              tin[v]--;              if(tin[v]==0){                  Q.push(v);              }          }      }      if(t!=n)return 1;      return ans;  }  inline void init(){      tot=-1;      mm0(in);      mm1(head);  }  int main(int argc, char const *argv[])  {      #ifdef DEBUG          freopen("D:in.in", "r", stdin);          freopen("D:out.out", "w", stdout);        #endif      char a,b;      while(~scanf("%d %d",&n,&m)&&(n+m)){          init();          int ans=1;          for(int i=0;i<m;++i){              char s[5];              scanf("%s",s);              a=s[0];b=s[2];              if(ans==0)continue;              in[b-‘A‘+1]++;              add(a-‘A‘+1,b-‘A‘+1);              int ok=tuopu();              if(ok==1){                  ans=0;                  printf("Inconsistency found after %d relations.\n",i+1);              }else if(ok==0){                  ans=0;                  printf("Sorted sequence determined after %d relations: ",i+1);                  for(int i=0;i<n;++i){                      printf("%c", ar[i]+‘A‘-1);                  }                  printf(".\n");              }          }          if(ans){              printf("Sorted sequence cannot be determined.\n");          }      }      return 0;  }  
View Code

 

poj1094-Sorting It All Out-拓撲排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.