Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

非排序算法,短数据全过…可是总有一些非常大的数据过不去,帮帮忙咯(带详细注释)

Posted by XX31415926 at 2010-07-28 20:08:42 on Problem 1094
做一个邻接矩阵,开始全部标记-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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator