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