標籤:des style blog color io os ar java for
Let‘s go home
Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1435 Accepted Submission(s): 573
Problem Description小時候,鄉愁是一枚小小的郵票,我在這頭,母親在那頭。
—— 余光中
集訓是辛苦的,道路是坎坷的,休息還是必須的。經過一段時間的訓練,lcy決定讓大家回家放鬆一下,但是訓練還是得照常進行,lcy想出了如下回家規定,每一個隊(三人一隊)或者隊長留下或者其餘兩名隊員同時留下;每一對隊員,如果隊員A留下,則隊員B必須回家休息下,或者B留下,A回家。由於今年集訓隊人數突破往年同期最高記錄,管理難度相當大,lcy也不知道自己的決定是否可行,所以這個難題就交給你了,呵呵,好處嘛~,免費**漂流一日。
Input第一行有兩個整數,T和M,1<=T<=1000表示隊伍數,1<=M<=5000表示對數。
接下來有T行,每行三個整數,表示一個隊的隊員編號,第一個隊員就是該隊隊長。
然後有M行,每行兩個整數,表示一對隊員的編號。
每個隊員只屬於一個隊。隊員編號從0開始。
Output可行輸出yes,否則輸出no,以EOF為結束。
Sample Input1 20 1 20 11 2 2 40 1 23 4 50 30 41 31 4
Sample Outputyesno
Author威士忌 題意在題目闡述得很明確 。那麼 , 很確定的是 ,要麼 隊長留下 , 要麼2名隊員留下。 然後對於 t對 隊員 , 不能同時留下, 也不能同時不留下。 可以看出 , 同一隊的兩名非隊長隊員可以看成一個點 , 隊長可以看成一個點 。 然後用 map 把他們的編號映射成一個新的編號 , 然後用新的編號去構圖 。 構出無向邊 u - v 表示 u 與 v 只能有一個成立 。 那麼在dfs 的時候 u 成立 , v^1 就必須成立 。
#include <iostream>#include <cstdio>#include <cstring>#include <stack>#include <map>using namespace std;const int N = 2010;const int M = 10010;int n , m ;int st[N] , top ;bool mark[N];int eh[N] , et[M] , nxt[M] , tot ;map<int,int>mp;void init(){ mp.clear(); tot = 0 ; memset( eh , -1 , sizeof eh ); memset( mark , false , sizeof mark );}void addedge( int u , int v ){ et[tot] = v , nxt[tot] = eh[u] , eh[u] = tot ++ ; et[tot] = u , nxt[tot] = eh[v] , eh[v] = tot ++ ;}bool dfs( int u ){ if( mark[u] ) return true; if( mark[u^1] ) return false; mark[u] = true ; st[top++] = u ; for( int i = eh[u] ; ~i ; i = nxt[i] ){ int v = et[i]; if( !dfs(v^1) ) return false; } return true;}bool solve(){ for(int i = 0 ; i < 2 * n ; i += 2 ){ if( !mark[i] && !mark[i+1] ){ top = 0 ; if( !dfs(i) ){ while( top > 0 ) mark[ st[--top] ] = false; if( !dfs(i+1) ) return false ; } } } return true;}int main(){ #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL ios::sync_with_stdio(0); int x1 , x2 , x3 ; while( cin >> n >> m ){ init(); for( int i = 0 ; i < n ; ++i ){ cin >> x1 >> x2 >> x3 ; mp[x1] = 2 * i ; mp[x2] = 2 * i + 1 ; mp[x3] = 2 * i + 1 ; } for( int i = 0 ; i < m ; ++i ){ cin >> x1 >> x2 ; x1 = mp[x1] ; x2 = mp[x2] ; addedge( x1 , x2 ); } if( solve() ) cout << "yes" << endl; else cout << "no" << endl; }}
HDU 1824 Let's go home