| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
原来 当拓扑排序不唯一(当然也就不确定)的时候 还要判断是否有环! nightKnight 2004-09-15 02:38:00.0 Problem 1094In Reply To:1094求助 Posted by:zouyuanrenren at 2006-04-13 21:53:39 > 感觉算法没有问题
> 依次读入关系,在邻接矩阵中加入边,按出度进行拓扑排序
> 找到出度为0的点
> 若有多个则尚无法排序
> 若没有,则存在环,有矛盾
> 若只有一个,将其删除,同时删除所有指向它的边,并将起加到输出序列中
> 循环,再次找出度为0的点
> 直到所有点都排到输出序列中,即可以排序
> 试了很多测试数据,也找不到错误
> 请各位帮忙看看问题在哪里
>
> #include <iostream>
>
> using namespace std;
>
> short matrix[26][26];
> int n, m;
> int seq[26];
>
> int hamilton()
> // if can be sorted, return 1
> // if inconsistency, return -1
> // other, return 0;
> {
> short image[26][26];
> bool mask[26];
> int i, j;
> int finish = 0;
> int leastnum = 0, least, less;
> // copy the matrix and find the least
> for(i = 0;i < n;i ++)
> {
> mask[i] = 1;
> less = 0;
> for(j = 0;j < n;j ++)
> {
> image[i][j] = matrix[i][j];
> less += matrix[i][j];
> }
> if(less == 0)
> {
> leastnum ++;
> least = i;
> }
> }
> if(leastnum == 0) // circuit found
> return -1;
> if(leastnum > 1)
> return 0;
> while(leastnum == 1)
> {
> seq[finish] = least;
> finish ++;
> for(i = 0;i < n;i ++)
> image[i][least] = 0;
> mask[least] = 0;
> leastnum = 0;
> for(i = 0;i < n;i ++)
> {
> less = 0;
> if(mask[i] == 0)
> continue;
> for(j = 0;j < n;j ++)
> less += image[i][j];
> if(less == 0)
> {
> leastnum ++;
> least = i;
> }
> }
> }
> if(leastnum == 0 && finish == n) // all characters sorted
> return 1;
> if(leastnum == 0)
> return -1;
> return 0;
> }
>
> int main()
> {
> int i, j;
> char left, right;
> bool ic, dt;
> int icnum, dtnum;
> int ham;
> cin>>n>>m;
> while(n + m)
> {
> // initialization
> ic = dt = 0;
> for(i = 0;i < n;i ++)
> {
> for(j = 0;j < n;j ++)
> matrix[i][j] = 0;
> }
> // input the relations and process
> for(i = 0;i < m;i ++)
> {
> cin>>left;
> cin>>right;
> cin>>right;
> if(ic || dt)
> continue;
> matrix[right - 'A'][left - 'A'] = 1;
> ham = hamilton(); // check weather there is a hamilton track existing
> if(ham == 1)
> {
> dt = 1;
> dtnum = i + 1;
> }
> if(ham == -1)
> {
> ic = 1;
> icnum = i + 1;
> }
> }
> if(ic)
> cout<<"Inconsistency found after "<<icnum<<" relations."<<endl;
> else
> {
> if(dt)
> {
> cout<<"Sorted sequence determined after "<<dtnum<<" relations: ";
> for(i = 0;i < n;i ++)
> cout<<char('A' + seq[i]);
> cout<<'.'<<endl;
> }
> else
> cout<<"Sorted sequence cannot be determined."<<endl;
> }
> cin>>n>>m;
> }
> return 0;
> }
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator