您的位置:首页 > 其它

南邮 OJ 1983 比赛成绩排序问题II

2015-08-08 09:45 211 查看

比赛成绩排序问题II

时间限制(普通/Java) : 2000 MS/ 6000 MS 运行内存限制 : 65536 KByte

总提交 : 218 测试通过 : 43


比赛描述

2013“华为杯”南京邮电大学大学生团体歌唱大赛比赛形式为:大赛分为多轮,每一轮随机选择参赛团体进行两两PK赛。当根据多轮多场的PK赛成绩能够确定排名次序时,大赛结束。

我们将问题进行简化,从1开始按递增顺序给每一个参赛团体分配一个整数编号,每个参赛团体在比赛期间表现出的歌唱水平各不相同且稳定不变,每场PK赛成绩必定胜负。给定已记录的多场PK赛成绩,请你根据胜负关系确定大赛是否应该结束,并且能够排除记录出现错误的情形。

举一个例子,共有三个参赛团体参加大赛,如果参赛团体1在PK赛中胜参赛团体3、参赛团体2在PK赛中胜参赛团体1,则可知参赛团体2的成绩比参赛团体3的成绩排名高,也说明参赛团体2的歌唱水平一定高于参赛团体3的歌唱水平;如果参赛团体1在PK赛中胜参赛团体2、参赛团体2在PK赛中胜参赛团体3、参赛团体3在PK赛中胜参赛团体1,则出现这种情形说明存在明显的记录错误。

输入

输入包括多个测试用例。

每个测试用例包括C+1行,第1行给出参赛团体总数M、已知PK赛成绩的场次数C;接下来有C行,每一行先后给出两个参赛团体编号p和q,表示编号为p的参赛团体在PK赛中胜编号为q的参赛团体;这里1≤M≤1000,1≤C≤500000,1≤p≤M,1≤q≤M,p≠q。

最后一行为“0 0”,表示输入结束,这一行无需处理。
输出

针对问题输入中的每个测试用例,输出一行字符串,具体规定如下:

l 根据已记录的PK赛成绩能够确定排名次序时,则输出字符串Competition over

l 根据已记录的PK赛成绩还不能确定排名次序时,则输出字符串Competition continue

l 根据已记录的PK赛成绩不可能确定排名次序时,则输出字符串Wrong Results

样例输入

4 3

4 3

3 2

2 1

4 3

4 3

2 3

1 4

4 3

4 3

1 4

3 1

0 0

样例输出

Competition over

Competition continue

Wrong Results

提示

本题对只限于修读任选课同学不作要求,有志于参加2014年南邮ACM竞赛集训队的同学不妨试试。

题目来源

SED

/* 398MS
#include<iostream>

#include<iostream>
using namespace std;
struct node
{
int k;
struct node *next;
node()
{
k=0;
next=NULL;
}
}*A,*p;
int *R,*T;
int M,C;
int topsort(struct node *A)
{
bool flag=false;
struct node *p,*q;
int temp_q=-1;
int num=0;
while(R[0]!=-1)
{
temp_q=-1;
if(R[R[0]]!=-1)
{
flag=true;
}
for(int i=R[0]; i!=-1;)
{
p=A[i].next;
while(p)
{
R[p->k]--;
if(R[p->k]==0)
{
R[p->k]=temp_q;
temp_q=p->k;
}
p=p->next;

}
R[0]=R[i];
num++;
i=R[i];
}
R[0]=temp_q;
}
if(num==M)
{
if(!flag)
return 0;
else
return -1;
}

else
{
return 1;
}
}

int main()
{
int a,b;
//    freopen("aa.txt","r",stdin);
while(scanf("%d%d",&M,&C)!=0)
{
if(!M|!C)
break;
A=new struct node[M+1];
R=new int[M+1];
T=new int[M+1];
for(int i=0; i<=M; i++)
{
R[i]=0;
T[i]=0;
}
for(int i=0; i<C; i++)
{
scanf("%d%d",&a,&b);
p=new node;
p->k=b;
p->next=A[a].next;
A[a].next=p;
R[b]++;
}
R[0]=-1;
for(int i=1; i<=M; i++)
{
if(R[i]==0)
{
R[i]=R[0];
R[0]=i;
}

}
int result=topsort(A);
if(result==0)
printf("Competition over\n");

else if(result==-1)
printf("Competition continue\n");

else
printf("Wrong Results\n");

}
return 0;
}
*/

/* Wrong Answer at Test 1
#include<iostream>

#define MAX_N 1001
bool map[MAX_N][MAX_N];
int in_degree[MAX_N];
int n;

// 返回 1 : 成功唯一排序
//      2 : 排序不唯一
//      3 : 有环,无法排序
int top_sort(){
int count=0;		//0入度的个数
int num=0;			//已经排序出来的额个数
int i,k,no_deg0;	//入度为0的编号
for(i=1;i<=n;i++){
if(in_degree[i]==0){
count++;
no_deg0 = i;
}
}
while(count==1){
num++;
count--;
k = no_deg0;
for(i=1;i<=n;i++){
if(map[k][i]){
if(--in_degree[i]==0){
count++;
no_deg0 = i;
}
}
}
}
if(num==n){
return 1;
}else if(count>1){
return 2;
}else{
return 3;
}
}

int main(){
int c,p,q;
while(scanf("%d%d",&n,&c)==2 && (n||c)){
if(c+1<n){
printf("Competition continue\n");
while(c--){
scanf("%*d%*d");
}
continue;
}
memset(map,0,sizeof(map));
memset(in_degree,0,sizeof(in_degree));
while(c--){
scanf("%d%d",&p,&q);
map[p][q] = 1;
in_degree[q]++;
}
c = top_sort();
if(c==1){
printf("Competition over\n");
}else if(c==2){
printf("Competition continue\n");
}else{
printf("Wrong Results\n");
}
}
}
*/

/* 328MS
#include<iostream>
#include<vector>
using namespace std;

#define MAX_N 1001
bool map[MAX_N][MAX_N];
int in_degree[MAX_N];
int n;

// 返回 1 : 成功唯一排序
//      2 : 排序不唯一
//      3 : 有环,无法排序
int top_sort(){
int num=0;			//已经排序出来的额个数
int i,k;
vector<int> vi;		//入度为0的编号
bool flag;
for(i=1;i<=n;i++){
if(in_degree[i]==0){
vi.push_back(i);
}
}
flag = 0;
while(vi.size()){
if(vi.size()>1){
flag = 1;
}
num++;
k = vi.back();
vi.pop_back();
for(i=1;i<=n;i++){
if(map[k][i]){
if(--in_degree[i]==0){
vi.push_back(i);
}
}
}
}
if(num==n){
if(flag){
return 2;
}else{
return 1;
}
}else{				//排不到最后,同时出现入度大于1的情况,算情况3
return 3;
}
}

int main(){
//	freopen("test.txt","r",stdin);
int c,p,q;
while(scanf("%d%d",&n,&c)==2 && (n||c)){
//		if(c+1<n){
//			printf("Competition continue\n");
//			while(c--){
//				scanf("%*d%*d");
//			}
//			continue;
//		}
memset(map,0,sizeof(map));
memset(in_degree,0,sizeof(in_degree));
while(c--){
scanf("%d%d",&p,&q);
map[p][q] = 1;
in_degree[q]++;
}
c = top_sort();
if(c==1){
printf("Competition over\n");
}else if(c==2){
printf("Competition continue\n");
}else{
printf("Wrong Results\n");
}
}
}
*/

/* 320MS
#include<iostream>

#define MAX_N 1001
bool map[MAX_N][MAX_N];
int in_degree[MAX_N];
int zero_degree[MAX_N];
int n;

// 返回 1 : 成功唯一排序
//      2 : 排序不唯一
//      3 : 有环,无法排序
int top_sort(){
int num=0;			//已经排序出来的额个数
int i,k;
bool flag;
for(i=1;i<=n;i++){
if(in_degree[i]==0){
zero_degree[++zero_degree[0]] = i;
}
}
flag = 0;
while(zero_degree[0]){
if(zero_degree[0]>1){
flag = 1;
}
num++;
k = zero_degree[zero_degree[0]];
zero_degree[0]--;
for(i=1;i<=n;i++){
if(map[k][i]){
if(--in_degree[i]==0){
zero_degree[++zero_degree[0]] = i;
}
}
}
}
if(num==n){
if(flag){
return 2;
}else{
return 1;
}
}else{
return 3;
}
}

int main(){
//	freopen("test.txt","r",stdin);
int c,p,q;
while(scanf("%d%d",&n,&c)==2 && (n||c)){
//		if(c+1<n){
//			printf("Competition continue\n");
//			while(c--){
//				scanf("%*d%*d");
//			}
//			continue;
//		}
memset(map,0,sizeof(map));
memset(in_degree,0,sizeof(in_degree));
memset(zero_degree,0,sizeof(zero_degree));
while(c--){
scanf("%d%d",&p,&q);
map[p][q] = 1;
in_degree[q]++;
}
c = top_sort();
if(c==1){
printf("Competition over\n");
}else if(c==2){
printf("Competition continue\n");
}else{
printf("Wrong Results\n");
}
}
}
*/

#include<iostream>

#define MAX_N 1001
int map[MAX_N][MAX_N];	//改用map存储邻居节点,反而时间更长了,变为429MS,可能因为int存取较慢,也可能数组偏移地址的运算耗时较多
int in_degree[MAX_N];
int zero_degree[MAX_N];
int n;

// 返回 1 : 成功唯一排序
//      2 : 排序不唯一
//      3 : 有环,无法排序
int top_sort(){
int num=0;			//已经排序出来的额个数
int i,k;
bool flag;
for(i=1;i<=n;i++){
if(in_degree[i]==0){
zero_degree[++zero_degree[0]] = i;
}
}
flag = 0;
while(zero_degree[0]){
if(zero_degree[0]>1){
flag = 1;
}
num++;
k = zero_degree[zero_degree[0]];
zero_degree[0]--;
int temp = map[k][0];
for(i=1;i<=temp;i++){
if(--in_degree[map[k][i]]==0){
zero_degree[++zero_degree[0]] = map[k][i];
}
}
}
if(num==n){
if(flag){
return 2;
}else{
return 1;
}
}else{
return 3;
}
}

int main(){
//	freopen("test.txt","r",stdin);
int c,p,q;
while(scanf("%d%d",&n,&c)==2 && (n||c)){
if(c+1<n){
printf("Competition continue\n");
while(c--){
scanf("%*d%*d");
}
continue;
}
memset(map,0,sizeof(map));
memset(in_degree,0,sizeof(in_degree));
memset(zero_degree,0,sizeof(zero_degree));
while(c--){
scanf("%d%d",&p,&q);
map[p][++map[p][0]] = q;
in_degree[q]++;
}
c = top_sort();
if(c==1){
printf("Competition over\n");
}else if(c==2){
printf("Competition continue\n");
}else{
printf("Wrong Results\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: