题意:有若干个然参加选举,然后会每次挑选来两个人出来选,赢得那个能继续参选,输的就被淘汰了。问你若你是每次挑人的那个人,你很自私能不能让你想赢的那个人赢。
思路:对于(a,b)若b能战胜a我们建有向边a->b,最终判断若是所有的节点都能到达你想要的那个人就是可以战胜的。写法类似于floyd。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstring> 6 #include <algorithm> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #include <set> 11 #include <map> 12 #define MP(a, b) make_pair(a, b) 13 #define PB(a) push_back(a) 14 15 using namespace std; 16 17 typedef long long ll; 18 typedef pair<int ,int> pii; 19 typedef pair<unsigned int, unsigned int> puu; 20 typedef pair<int ,double> pid; 21 typedef pair<ll, int> pli; 22 typedef pair<int, ll> pil; 23 24 const int INF = 0x3f3f3f3f; 25 const double eps = 1e-6; 26 const int LEN = 102; 27 int Map[LEN][LEN], cad[LEN][LEN], win, n, m; 28 29 int main() 30 { 31 // freopen("in.txt", "r", stdin); 32 33 int pos; 34 while(scanf("%d%d%d", &n, &m, &win)!=EOF){ 35 if(!n && !m && !win) break; 36 for(int i=0; i<m; i++){ 37 for(int j=0; j<n; j++){ 38 scanf("%d", &pos); 39 cad[i][pos-1] = j; 40 } 41 } 42 memset(Map, 0, sizeof Map); 43 for(int i=0; i<n; i++){ 44 for(int j=0; j<n; j++){ 45 if(i==j){Map[i][j] = 1;continue;} 46 int cnt = 0; 47 for(int k=0; k<m; k++){ 48 if(cad[k][i] > cad[k][j]) cnt++; 49 } 50 if(cnt>m/2) Map[i][j] = 1; 51 } 52 } 53 for(int k=0; k<n; k++) 54 for(int i=0; i<n; i++){ 55 for(int j=0; j<n; j++){ 56 if(Map[i][k] && Map[k][j])Map[i][j] = 1; 57 } 58 } 59 int ans = 1; 60 for(int i=0; i<n; i++)if(Map[i][win-1]==0)ans = 0; 61 if(ans)printf("yes\n"); 62 else printf("no\n"); 63 } 64 return 0; 65 }