1. 程式人生 > 其它 >紫書習題5-4交換學生 UVA10763

紫書習題5-4交換學生 UVA10763

技術標籤:紫書

題意:給出n個二元組,對於前後互換相等的稱為匹配的二元組如(1,2)與(2,1).如果所有二元組都匹配輸出YES,否則輸出NO

思路:注意有重複的資料....

然後我們考慮匹配的二元組數目一定是相等的,比如有多少個(1,2)就一定有多少個(2,1)只要檢查每個二元組和它對應的數目是否相等,不相等就退出輸出NO.

實現方法就是用map記錄每個二元組出現的次數,遍歷一次map,每次都檢查一次二元組和它對應的匹配組數目是否相同.

for(const auto & p :stu){
			PII x= make_pair(p.first.second,p.first.first);
			if(p.second!=stu[x]){
				flag=false; break;
			}
		}

要強調下遍歷容器的簡便方法(c++11以上)使用.first .second來使用.

最後是程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int main(){ int i,j,k,n,m,a,b;
	while(scanf("%d",&n)==1&&n){
		map<PII,int> stu;
		
		for(i=1;i<=n;i++){
			scanf("%d%d",&a,&b);
			stu[make_pair(a,b)]++;
		}
		if(n%2){
			cout<<"NO"<<endl;
		}
		bool flag=true;
		for(const auto & p :stu){
			PII x= make_pair(p.first.second,p.first.first);
			if(p.second!=stu[x]){
				flag=false; break;
			}
		}
		if(flag) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
return 0;}