| ||||||||||
| 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 | |||||||||
非排序算法,短数据全过…可是总有一些非常大的数据过不去,帮帮忙咯(带详细注释)做一个邻接矩阵,开始全部标记-1。标记通为 1,新增一条有向边 E<V1,V2>
label_1:
map[i][j]=map[j][i] 则输出矛盾
如果已经标记为1,则是一个已知的关系,跳过
然后如果未标记,标记 E<V1,V2> = 1;
并且,递归考察所有 V1 的入度以及 V2 的出度
每标记一个新的边,计数count++
那么,确定所有关系的条件就是 count = N * ( N - 1 ) / 2
贴上代码:
#include <iostream>
using namespace std;
//A 65 1 49
int n,m; //字母数量,判断数量
int map[30][30]; //邻接矩阵
char sort[30]; //输出时使用的字符数组
int sum[30]; //上文计数用的count
int result,step; //结果标志,用了几步
bool sorted() //判断排序结束
{
int add=0;
for(int i=1; i<=n; i++)
add+=sum[i];
if(add*2==n*n-n) return true;
return false;
}
int com(const void* a,const void *b) //qsort用的比较函数,借助count排序,
{ //'ch'大于的字母多它的sum就大
if(sum[*(char*)a-64]>sum[*(char*)b-64]) return 1;
if(sum[*(char*)a-64]<sum[*(char*)b-64]) return -1;
cout<<"wrong in com"<<endl;return 0; // assert断言 这里不应该存在相等的情况
}
void connect(int a,int b) //添加一条有向边(a,b)表示a>b 直接递归
{
map[a][b]=1;++sum[a];
for(int i=1; i<=n; i++) if(map[b][i]==1&&i!=b&&map[a][i]!=1) connect(a,i);
for(int j=1; j<=n; j++) if(map[j][a]==1&&j!=a&&map[j][b]!=1) connect(j,b);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while((cin>>n>>m)&&(n!=0))
{
//初始化
result=step=0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) map[i][j]=-1;
sort[i]=64+i; sum[i]=0;//sort初始化字母表顺序
}
//读入数据
char a,b,c; //读数据用的变量
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(result){continue;} //结果已经有了 吃数据用的
if(map[a-64][c-64]==1) {result=2; step=i; continue;} //矛盾 返回不可能
connect(c-64,a-64); //添加边(递归)
if( sorted() ) {result=1; step=i; continue;} //排序完成
}
switch(result)
{
case 0:
cout<<"Sorted sequence cannot be determined."<<endl;
break;
case 1:
cout<<"Sorted sequence determined after "<<step<<" relations: ";
qsort(sort+1,n,sizeof(sort[0]),com); //对输出排序
for(int i=1; i<=n; i++) cout<<sort[i]; //输出字符数组
cout<<"."<<endl;
break;
case 2:
cout<<"Inconsistency found after "<<step<<" relations."<<endl;
break;
}
}//end while
return EXIT_SUCCESS; //这行没有任何问题
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator