题意如下
有n(1≤n≤500000)个学生想交换到其他学校学习。为了简单起见,规定每个想从A学
校换到B学校的学生必须找一个想从B换到A的“搭档”。如果每个人都能找到搭档(一个人不
能当多个人的搭档),学校就会同意他们交换。每个学生用两个整数A、B表示,你的任务
是判断交换是否可以进行。
下面展示C++程序
#include<iostream>
#include<map>
#include<stdio.h>
using namespace std;
#define _for(i,a,b) for(int i = a ; i < b ; i++ ) // 宏定义
int readint() { // 封装输入操作
int x;
scanf("%d",&x);
return x;
}
int main(){
// 建立映射关系 即 每一对关系 与 每一对关系的个数 的映射
map<pair<int,int>,int> ex;
int n;
while(n = readint()){
bool ans = true;
ex.clear();
_for(i,0,n){
int A = readint(), B = readint();
ex[make_pair(A,B)]++;
}
// 遍历映射
map<pair<int,int>,int>::iterator it = ex.begin();
for(;it != ex.end(); it++){
// 交换并建立关系对
pair<int,int> p2 = make_pair(it->first.second,it->first.first);
if(it->second != ex[p2]){
ans = false;
break;
}
}
puts(ans ? "YES" : "NO");
}
return 0;
}
结果显示:
参考:算法入门经典习题与解答 陈锋 编著