程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVa 10763 - Foreign Exchange

UVa 10763 - Foreign Exchange

編輯:C++入門知識

原題:
Your non-profit organization (iCORE - international Confederation of Revolver Enthusiasts) coordinates a very successful foreign student exchange program. Over the last few years, demand has sky-rocketed and now you need assistance with your task.
The program your organization runs works as follows: All candidates are asked for their original location and the location they would like to go to. The program works out only if every student has a suitable exchange partner. In other words, if a student wants to go from A to B, there must be another student who wants to go from B to A. This was an easy task when there were only about 50 candidates, however now there are up to 500000 candidates!
Input

The input file contains multiple cases. Each test case will consist of a line containing n - the number of candidates (1≤n≤500000), followed by n lines representing the exchange information for each candidate. Each of these lines will contain 2 integers, separated by a single space, representing the candidate's original location and the candidate's target location respectively. Locations will be represented by nonnegative integer numbers. You may assume that no candidate will have his or her original location being the same as his or her target location as this would fall into the domestic exchange program. The input is terminated by a case where n = 0; this case should not be processed.
 
Output
For each test case, print "YES" on a single line if there is a way for the exchange program to work out, otherwise print "NO".
 
題目大意:
交換生現在是很受歡迎的,現在又一個負責這個的組織,經常會收到一大批的申請表, 申請內容是從A國家到B國家的。對於一批申請表, 會有各個不同國家申請到另外各個不同的國家, 假設有任意一個申請A到B的,但是沒有B到A的申請, 那麼這批申請表都不能被處理。

分析與總結:
題目可以看出, 對於申請A到B的,那麼一定需要有相對應的從B到A的,而且數量也必須要相對應。例如有兩個A到B,但是只有一個B到A,那麼也是不行的。
那麼, 我們可以給出一個升序序列0,1,2,3,4,5,……n,存在數組arr中,  對於每個申請表,假設是A到B,就swap(arr[A], arr[B])。
全部處理完後, 判斷這個序列是否還是和原來的排列一樣。如果是的話,就符合條件。否則就不行。(因為對於每個swap(arr[A]),arr[B])如果有一個相對應的swap(arr[B], arr[A]),   那麼相當於恢復了原排列)

[cpp] 
/*
 * UVa  10763 - Foreign Exchange
 * Time   :  0.132s(UVa)
 * Author :  D_Double
 *
 */ 
 
#include<iostream> 
#include<cstdio> 
#include<string> 
#include<algorithm> 
#define MAXN 500005 
using namespace std; 
int arr[MAXN]; 
 
void swap(int a,int b){ 
    int t=arr[a]; arr[a] = arr[b]; arr[b] = t; 

 
void init(){ 
    for(int i=0; i<MAXN; ++i) 
        arr[i] = i; 

 
bool isOk(){ 
    for(int i=0; i<MAXN; ++i) 
        if(arr[i]!=i) return false; 
    return true; 

 
int main(){ 
    int n, i, a, b; 
    while(scanf("%d",&n), n){ 
        init(); 
        for(int i=0; i<n; ++i){ 
            scanf("%d %d", &a, &b); 
            swap(a, b); 
        } 
        if(isOk()) printf("YES\n"); 
        else printf("NO\n"); 
    } 
    return 0; 


作者:shuangde800

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved