uva 10763 Foreign Exchange 习题5-4 (STL 练习)

题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=19&problem=1704


题意:有一个非营利性的国际性机构执行一项国际交换学生计画。这几年来执行得相当好,有越来越多的学生想要参与这项计画,所以现在请你来帮忙这个机构。每个提出交换学生申请的人有2项资料:他来自哪一国,他想要交换到哪一国。这个计画只有在每个学生都可以找到一个交换对象的时候才算成功。换句话说,假如有一个学生想要从A国到B国,那么一定要有另一个学生从B国到A国。如果只有50个学生提出申请,要判断这计画是否可行相当简单,然而现在最多已经有 500000个学生了。——转自http://blog.csdn.net/zju_ziqin/article/details/19489799


参考博客:http://www.cnblogs.com/staginner/archive/2011/09/20/2182774.html


分析:考虑从a到b的个数,和从b到a的个数,这俩个数是否相等,如果不相等输出NO。(不知道是否正确,因为数据较水)。


收获:map<node,int>中node要有自定义排序函数,另外p.first 代表key,p.second代表映射值,p.find()也了解了怎么应用,总之收获不小。


<span style="font-size:18px;">#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
struct info{
    int a,b;
    bool operator < (const info &e) const{
        if(a!=e.a) return e.a>a;
        return e.b>b;
    }
}pp,ss;
map<info,int> p;
int main(){
    int n,a,b;
    while(cin >>n &&n){
        p.clear();
        for(int i=0;i<n;i++){
            cin >>pp.a>>pp.b;
            p[pp]++;
        }
        map<info,int>::iterator it;
        int ok=1;
        for(it=p.begin();it!=p.end();it++){
            int a=(*it).first.a;
            int b=(*it).first.b;
            ss.a=b;
            ss.b=a;
            if( p[(*it).first]!=p[ss]) {ok=0;break;}
        }
        if(ok) cout << "YES\n";
        else   cout << "NO\n";
    }
    return 0;
}
</span>



你可能感兴趣的:(uva 10763 Foreign Exchange 习题5-4 (STL 练习))