| ||||||||||
| 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 | |||||||||
1094求助感觉算法没有问题
依次读入关系,在邻接矩阵中加入边,按出度进行拓扑排序
找到出度为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