poj 1094 Sorting it all out

这题很奇怪,在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值