zoukankan      html  css  js  c++  java
  • 拓扑排序

    poj 1094   Sorting It All Out   http://poj.org/problem?id=1094

    【题意】:给出n个点 m对大小关系 求输入第几对关系的时候 可以把整个图n个点的大小关系确定 或出现环 一旦发现出现了环或确定下了大小关系后面的都不用管了 做法是: 每进去一条边就判断一次 一发现都上述两种情况就可以输出了

     1 #include<iostream>
     2 #include<queue>
     3 using namespace std;
     4 int g[100][100],ss[100],n,m,degree[100],uu[1000],vv[1000],temp[100];
     5 
     6 
     7 int solve()
     8 {
     9     queue<int > q;
    10     int i,j,num,k;
    11     k=0;
    12     num=0;
    13     for(i=0;i<n;i++)                
    14         temp[i]=degree[i];    
    15     for(i=0;i<n;i++)
    16         if(temp[i]==0)
    17         {
    18             q.push (i);
    19             num++;
    20             if(num>1)
    21                 k=1;            
    22         }
    23         int nn=0;
    24         while(!q.empty ())
    25         {
    26             int t=q.front ();q.pop ();ss[nn++]=t;
    27             num=0;
    28             for(i=0;i<n;i++)
    29                 if(g[t][i]==1)
    30                 {
    31                     temp[i]--;
    32                     if(temp[i]==0)
    33                     {
    34                         q.push (i);
    35                         num++;
    36                         if(num>1)   //用拓扑排序 删点过程中出现不止一个入度为0(这几个入度为0的点之间的大小不能确定)
    37                             k=1;
    38                     }
    39                 }
    40         }        
    41         if(nn<n)
    42             return 2;
    43         else
    44         {
    45             if(k==0)
    46                 return 1;
    47             return 0;
    48         }
    49 }
    50 
    51 int main()
    52 {
    53     int i,j;
    54     char u,v,h;
    55     while(scanf("%d%d",&n,&m))
    56     {
    57         if(n==0&&m==0)
    58             break;
    59         for(i=1;i<=m;i++)
    60         {
    61             getchar();
    62             scanf("%c%c%c",&u,&h,&v);
    63             uu[i]=u-'A';  vv[i]=v-'A';
    64         }
    65         memset(g,0,sizeof(g));
    66         memset(degree,0,sizeof(degree));
    67         for(i=1;i<=m;i++)
    68         {
    69             if(g[uu[i]][vv[i]]==0)
    70             {
    71                 g[uu[i]][vv[i]]=1;
    72                 degree[vv[i]]++;//入度 
    73             }            
    74             int ans=solve();       //0是没排好序 1排好了 2有环
    75             if(ans!=0)
    76             {
    77                 if(ans==1)
    78                 {
    79                     printf("Sorted sequence determined after %d relations: ",i);
    80                     for(j=0;j<n;j++)
    81                         printf("%c",ss[j]+'A');
    82                     printf(".
    ");
    83                 }
    84                 if(ans==2)                    
    85                     printf("Inconsistency found after %d relations.
    ",i);                
    86                 break;
    87             }
    88         }
    89         if(i>m)
    90             printf("Sorted sequence cannot be determined.
    ");
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    《Flutter实战入门》下拉刷新组件的使用方法
    百度HTTPS认证失败解决方法
    unity踩过的音频坑
    如何解决flutter中gradle慢的问题
    如何在ubuntu里面关掉后台的meteor
    ruby生成随机成绩
    Gemfile分平台加载gem
    sublime text2在windows中以命令行启动
    右键添加 CMD 命令提示符
    修复sublime text系统右键菜单
  • 原文地址:https://www.cnblogs.com/assult/p/3313267.html
Copyright © 2011-2022 走看看