交换学生(Foreign Exchange ,UVa10763)
题目描述:
有
n
(
1<=n<=500000
)个学生想交换到其他学校学习
。
A
到
B
学校的前提是找到一个
B
到
A
的搭档
。
n
个学生两两两交换就
ok
,
A,B
用两个整数表示。
思路详解:
首先定义一个数组
d[ ]
存储每个学生本来的位置。当交换后,两个学生位置变换。
如果
A
想换到
B
,并且
B
想换到
A
,两两交换后,
d[A]
、
d[B]
不变,也就是学生位置不变。
否则,交换不可以进行。
代码:
#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;
int d[500005];
void init()//初始化数组
{
int i;
for(i=0;i<500005;i++)
d[i]=i;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int i,a,b,flag=0;//flag标记交换能不能进行
init();
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
swap(d[a],d[b]);//交换两个学生的位置
}
for(i=0;i<500005;i++)
if(d[i]!=i){flag=1;printf("NO\n");break;}
if(flag==0)printf("YES\n");
}
return 0;
}