一、题意

一堆学生要申请换学院。
有若干组数据。
每组第一行表示申请个数。
之后每一行为两个数(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)来遍历,倒是个挺方便的写法