交换学生(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;
}