• POJ1094


    题目链接:http://poj.org/problem?id=1094

    解题思路:

      思路来源于网络。

      唉,说到底对于图论的理解还是太浅了。

      A<B可以看成A-->B,这样就不难把问题转换成一个拓扑排序了。把每一个不等式看成一条边,逐一往图中加边,每加入一条边检查一次。

      1、建一个队列,像 bfs 那样,让所有入度为 0 的点入队。对于每一个入度为 0 的点,与它相连的所有点的入度全部 -1,然后继续让所有入度为 0 的未访问过的点入队;

      2、任何时刻,一旦发现队列中有多个点,就说明直到目前为止,仍然没有唯一解;

      3、最精彩的一点!在所有元素都出队以后,计算遍历过的所有元素的总数量p,一旦发现 p<n ,就说明这个有向图有环!仔细想想:对于形成环的点来说,它们的入度是不可能为0的,所以,如果图中有环,那么环中的点就不会被遍历到,那么我们遍历到的元素总数量就会小于n。在下拜服!

      其他的还有一些细节,请看代码注释。

    AC代码:

     1 #include <cstdio>
     2 #include <vector>
     3 using namespace std;
     4 
     5 vector<int> out[30];
     6 int in[30],tin[30];
     7 int n,m;
     8 char ans[10000];
     9 int topu(){
    10     int ret=1;
    11     int que[10000];
    12     int head=0,ending=0;
    13     for(int i=0;i<n;i++){
    14         tin[i]=in[i];       //用tin[]暂时代替in[]
    15         if(tin[i]==0){
    16             que[ending]=i;
    17             ending++;
    18         }
    19     }
    20     int p=0;
    21     while(ending>head){
    22         if(ending>head+1)   ret=0;  //0代表暂时无唯一解
    23         ans[p++]=que[head]+'A'; 
    24         for(int i=0;i<out[que[head]].size();i++){
    25             tin[out[que[head]][i]]--;
    26             if(tin[out[que[head]][i]]==0){
    27                 que[ending]=out[que[head]][i];
    28                 ending++;
    29             }
    30         }
    31         head++;
    32     }
    33     ans[p]='';
    34     if(p<n) ret=-1;     //-1代表有环,有环就有矛盾
    35     return ret;
    36 }
    37 int main(){
    38     char temp[5];
    39     while(scanf("%d%d",&n,&m)==2&&(n||m)){
    40         for(int i=0;i<n;i++){
    41             in[i]=0;        //记录每个点的入度
    42             out[i].clear(); //记录从各个点出发所连接的点
    43         }
    44         bool flag=false;    //记录是否已经得出结论
    45         for(int t=1;t<=m;t++){
    46             scanf("%s",temp);
    47             if(flag)    continue;   //如果已经得出结论,那么就不必继续加边检验了
    48             in[temp[2]-'A']++;
    49             out[temp[0]-'A'].push_back(temp[2]-'A');
    50             int tt=topu();
    51             if(tt==-1){     
    52                 flag=true;
    53                 printf("Inconsistency found after %d relations.
    ",t);
    54             }
    55             else if(tt==1){
    56                 flag=true;
    57                 printf("Sorted sequence determined after %d relations: %s.
    ",t,ans);
    58             }
    59         }
    60         if(!flag)   printf("Sorted sequence cannot be determined.
    ");
    61     }
    62     return 0;
    63 }
    “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
  • 相关阅读:
    Delphi开发动态连接库的方法和规范
    EntityFramework+DomainDataSource+Silverlight完成数据读取分页排序与修改
    啊啊啊啊
    HTML、CSS、JavaScript从零开始系列文章
    从JAVA学思想,在.Net用……关于各种模型,备案以便查
    为ExtJS 4 系列树添加可将节点拖动到叶子节点上的功能,可配置
    在使用WCF RIA Services时所要注意的,不断更新中……
    修复EXTJS 4.0.2a在ie9与FIREFOX下字体过小、表格头部字体在Chrome下模糊的CSS补丁
    修复EXTJS 4.0.2a下面gridFilter的type为list时,不能从服务器读取列表数据的bug
    大学生程序员,"我们将要何去何从?!"
  • 原文地址:https://www.cnblogs.com/Blogggggg/p/7497023.html
Copyright © 2020-2023  润新知