uva10763 简单做法

转载请注明出处,谢谢!

原文地址:

http://blog.csdn.net/monkeyduck

题意开始有点歧义,我以为只要方案可行即输出YES,就是在1 2,2 3,3 1这种方案的情况下应该是可以的。但是跑到网上去试验发现这种方法不行,因为题目要求就是两个

学生互换,A.X==B.Y&&B.X==A.Y才可以配对成功。所以想到用结构体,然后用链表存储,配对一对后即删除节点,知道最后没有节点就输出YES,否则输出NO。

可是担心时间超时,所以只是有了这么个思路,并没有动手编程,想了想觉得可以有更简单的办法,即用邻接矩阵存储边,a—>b就意味着正向边加1,反向边减1,只有还

存在着b—>a的情况,才配对成功,此时map【a】【b】=map【b】【a】=0

#include<iostream>
#include<cstring>
using namespace std;

const int MAX = 1003;
int map[MAX][MAX];
int n;
bool is_ok()
{
	for (int i=0;i<MAX/2;i++)
	{
		for (int j=0;j<MAX;j++)
		{
			if (map[i][j]!=0||map[j][i]!=0)
				return 0;
		}
	}
	return 1;
}
int main()
{
	while(cin>>n&&n)
	{
		memset(map,0,sizeof(map));
		for (int i=0;i<n;i++)
		{
			int a,b;
			cin>>a>>b;
			map[a][b]++;
			map[b][a]--;
		}
		if (n%2==1) 
		{
			cout<<"NO"<<endl;
			continue;
		}
		if (is_ok()) 
			cout<<"YES"<<endl;
		else 
			cout<<"NO"<<endl;
	}

	return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值