Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
0msAC, 这数据是有多水?#include <iostream> #include <vector> #include <string> #include <queue> using namespace std; int num; vector<int> adj[26]; vector<int> ltfz[26]; int conn[26][26] = {0}; bool state[26] = {false}; //int state3[26] = {0}; bool kexing[26][3] = {false}; int yx[26][3] = {0}; bool dfs(int, int); void init(){ for(int i = 0; i < 26; i++){ for(int j = 0; j < 3; j++){ kexing[i][j] = true; } } for(int i = 0; i < 26; i++){ for(int j = 0; j < 3; j++) yx[i][j] = -1; } for(int i = 0; i < 26; i++) { adj[i].clear(); } for(int i = 0; i < 26; i++){ ltfz[26].clear(); } for(int i = 0; i < 26; i++){ state[i] = false; } for(int i = 0; i < 26; i++){ for(int j = 0; j < 26; j++){ conn[i][j] = 0; } } } int main() { while(1){ init(); cin >> num; //cout << num << endl; if(num == 0) return num; int cnt = 0; for(int i = 0; i < num; i++){ string s; cin >> s; int len = s.length(); for(int j = 2; j < len; j++){ conn[i][s[j]-'A'] = 1; adj[i].push_back(s[j]-'A'); cnt++; } } if(cnt == 0){ cout << "1 channel needed." << endl; continue; } int ltfzgs = 0; bool ers[26]; for(int i = 0; i < num; i++){ if(state[i]) continue; state[i] = true; ers[i] = true; queue<int> bfs; bfs.push(i); ltfz[ltfzgs].push_back(i); while(!bfs.empty()){ int thi = bfs.front(); bfs.pop(); int sz = adj[thi].size(); for(int j = 0; j < sz; j++){ int idx = adj[thi][j]; if(state[idx]) continue; bfs.push(idx); if(ers[thi]) ers[idx] = false; else ers[idx] = true; ltfz[ltfzgs].push_back(idx); state[idx] = true; } } ltfzgs++; } bool kyers = true; for(int i = 0; i < num; i++){ int sz = adj[i].size(); for(int j = 0; j < sz; j++){ if((ers[i] + ers[adj[i][j]])%2 == 0){ kyers = false; goto wanle; } } } wanle: if(kyers){ cout << "2 channels needed." << endl; continue; } bool kysrs = true; for(int i = 0; i < ltfzgs; i++){ int sz = ltfz[i].size(); if(sz <= 3) continue; for(int j = 1; j < sz; j++){ for(int k = j; k > 0; k--){ if(adj[ltfz[i][k]].size() <= adj[ltfz[i][k-1]].size()) break; int temp = ltfz[i][k]; ltfz[i][k] = ltfz[i][k-1]; ltfz[i][k-1] = temp; } } for(int j = 0; j < adj[ltfz[i][0]].size(); j++){ kexing[adj[ltfz[i][0]][j]][0] = false; yx[adj[ltfz[i][0]][j]][0] = ltfz[i][0]; } if(!dfs(i, sz-1)){ kysrs = false; break; } } if(kysrs) cout << "3 channels needed." << endl; else cout << "4 channels needed." << endl; } return 0; } bool dfs(int i, int gs){ if(gs == 0) return true; int sz = ltfz[i].size(); int kldd = ltfz[i][sz - gs]; if(kexing[kldd][0]){ for(int j = 0; j < adj[kldd].size(); j++){ if(kexing[adj[kldd][j]][0]){ kexing[adj[kldd][j]][0] = false; yx[adj[kldd][j]][0] = kldd; } } if(dfs(i, gs-1)) return true; for(int j = 0; j < adj[kldd].size(); j++){ if(!kexing[adj[kldd][j]][0] && yx[adj[kldd][j]][0] == kldd){ kexing[adj[kldd][j]][0] = true; yx[adj[kldd][j]][0] = -1; } } } if(kexing[kldd][1]){ for(int j = 0; j < adj[kldd].size(); j++){ if(kexing[adj[kldd][j]][1]){ kexing[adj[kldd][j]][1] = false; yx[adj[kldd][j]][1] = kldd; } } if(dfs(i, gs-1)) return true; for(int j = 0; j < adj[kldd].size(); j++){ if(!kexing[adj[kldd][j]][1] && yx[adj[kldd][j]][1] == kldd){ kexing[adj[kldd][j]][1] = true; yx[adj[kldd][j]][1] = -1; } } } if(kexing[kldd][2]){ for(int j = 0; j < adj[kldd].size(); j++){ if(kexing[adj[kldd][j]][2]){ kexing[adj[kldd][j]][2] = false; yx[adj[kldd][j]][2] = kldd; } } if(dfs(i, gs-1)) return true; for(int j = 0; j < adj[kldd].size(); j++){ if(!kexing[adj[kldd][j]][2] && yx[adj[kldd][j]][2] == kldd){ kexing[adj[kldd][j]][2] = true; yx[adj[kldd][j]][2] = -1; } } } return false; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator