poj 1094 Sorting it all out

来源:互联网 发布:网络配音cv大神 编辑:程序博客网 时间:2024/05/18 11:05
这题很奇怪,在zoj上一直过不了,不知道问题出现在哪里。不过在poj上过了
#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <vector>using namespace std;int kcount[26];//入边表,记录定点的入度int temp[26];//就是kcount的拷贝,在拓扑排序时用于修改char relation[3],seq[26];//relation用于读入对象的关系,seq用于储存得到的序列bool alpha[26];//alpha用于检查对象是否检查过int n, m;vector< vector< char > >v;//一般思路可以先建好图再进行拓扑排序,但是本题要求在第几个关系式下可以判断出来,因此要输入一次,就进行一次拓扑排序;//拓扑排序时,用了一个flag标志变量,如果int TopSort( int s ){     int i, j, r, cnt;//r表示得到的序列中元素个数,cnt表示定点入度为零的个数     bool flag;//flag标志变量,查看拓扑排序结束后,是否能够得到序列     r = 0, cnt = 0;     for(i = 0; i < n; ++i)          temp[i] = kcount[i];     flag = 1;     while(s--)     {          cnt = 0;          for(i = 0; i < n; ++i)          {               if(temp[i] == 0)                    j = i, cnt++;          }          if(cnt >= 1)          {               //cnt = 1;表明就有一个入度为零的定点,那么该定点就位于序列的最前端               if(cnt > 1)                    flag = 0;               int h = v[j].size();               for(i = 0; i < h; ++i)                    temp[ (int)v[j][i] ]--;               seq[r++] = (char)(j + 'A');               temp[j] = -1;               seq[r] = 0;          }          else if(cnt == 0)               return -1;     }     if(flag)          return r;     else          return 0;}int main(){    int i, t, k, c;    int determed;    char tmp[26];    while(1)    {         cin>>n>>m;         if(n == 0 && m == 0)          break;         memset(kcount, 0, sizeof(kcount));         memset(alpha, false, sizeof(alpha));         v.clear(), v.resize(n);         c = 0, determed = 0;         for(i = 0; i < m; ++i)         {              cin>>relation;              kcount[ relation[2] - 'A' ]++;              v[ relation[0] - 'A' ].push_back( relation[2] - 'A' );              if( !alpha[ relation[0] - 'A' ] )               c++, alpha[ relation[0] - 'A' ] = true;              if( !alpha[ relation[2] - 'A' ] )               c++, alpha[ relation[2] - 'A' ] = true;              if( determed == 0)              {                   t = TopSort( c );                   if( t == -1 )                   {                        determed = -1;                        k = i+1;                   }                   else if(t == n)                    {                         determed = 1;                         k = i+1;                         strcpy(tmp, seq);                   }              }         }         if(determed == 1)          cout<<"Sorted sequence determined after "<<k<<" relations: "<<tmp<<"."<<endl;         else if(determed == 0)          cout<<"Sorted sequence cannot be determined."<<endl;         else          cout<< "Inconsistency found after "<<k<< " relations."<<endl;    }    return 0;}

原创粉丝点击