一.题目
题目链接:Uva10763
二.思路
将每个学生的信息保存成pair,用map容器存储进行映射,映射的值是该pair的出现次数,最后判断的时候,遍历map,判断是否能成功完成交换的条件是所有的pair对,将其中的两个元素交换,如果这两个pair对的映射值相等,就说明能完成交换,有任意一对不不相等则失败,注意要先判断一下交换元素后的pair对在map中是否存在,再进行数值判断,详情请看注释。
三.源代码
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
vector<int> x; //保存每行学生信息中的学生所属学校id
vector<int> y; //保存每行学生信息中学生想去的学校id
bool check(map<pair<int, int>, int> i) {
int len = x.size();
for (int t = 0; t < len; t++) {
//遍历map,判断是否能成功完成交换的条件是所有的pair对,将其中的两个元素交换
//如果这两个pair对的映射值相等,就说明能完成交换,有任意一对不不相等则失败
//注意要先判断一下交换元素后的pair对在map中是否存在,再进行数值判断
if ((!i.count(pair<int, int>(x[t], y[t]))) ||
(i[pair<int, int>(x[t], y[t])] != i[pair<int, int>(y[t], x[t])]))
return false;
}
return true;
}
int main() {
bool ok = false;
map<pair<int, int>, int> info;
int n, temp1, temp2;
while ((cin >> n) && n) {
for (int i = 0; i < n; i++) {
cin >> temp1;
x.push_back(temp1); //将值保存到相应的容器中
cin >> temp2;
y.push_back(temp2);
if (info.count(pair<int, int>(temp1, temp2))) //如果已经存在了这个pair的映射,则将数值+1
info[pair<int, int>(temp1, temp2)]++;
else //如果不存在这个pair的映射,则初始化
info[pair<int, int>(temp1, temp2)] = 1;
}
ok = check(info);
if (ok == true)
cout << "YES" << endl;
else
cout << "NO" << endl;
//清空容器
vector<int> empty1;
vector<int> empty2;
swap(x, empty1);
swap(y, empty2);
info.clear();
}
return 0;
}
本文介绍了解决Uva10763问题的方法,通过使用C++中的map容器来存储学生信息及其匹配次数,实现了对学生交换意愿的有效验证。
420

被折叠的 条评论
为什么被折叠?



