一、题意
一堆学生要申请换学院。
有若干组数据。
每组第一行表示申请个数。
之后每一行为两个数(A, B),表示这个人想从A换到B学院。
如果同时存在一对(A,B)和(B,A)则这两个人可以交换。
求最终所有人能否交换成功。
二、解析
用一个map来存储信息,比如当有(A,B)申请时, 将(A, B)在map中+1,然后当有一个(B,A)申请时,再将(A, B)在map中-1,表示抵消。最终看是否能完全抵消即可。
可用A,B的大小关系来区分是正标记还是负抵消。
三、代码
#include <iostream> #include <map> #define mp make_pair using namespace std; map<pair<int, int>, int> flag; int n; int main() { while(cin >> n && n) { flag.clear(); while(n --) { int x, y; cin >> x >> y; if(x < y) flag[mp(x, y)] ++; else flag[mp(y, x)] --; } bool ok = 1; for(auto p : flag) if(p.second != 0) { ok = 0; break; } cout << (ok ? "YES" : "NO") << endl; } }
四、归纳
- 简单题,不过发现map在C++11已经可以直接for(auto x: x_map)来遍历,倒是个挺方便的写法