码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder#1139 二分·二分答案

时间:2015-04-10 22:22:13      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

原题地址

 

挺简单一道题,结果因为一时傻逼写错一个小地方,导致WA成狗了_(:з」∠)_

 

代码:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 
 5 using namespace std;
 6 
 7 #define MAX_V 10008
 8 #define MAX_E 200008
 9 
10 int N, M, K, T;
11 int f[MAX_V];
12 bool v[MAX_V];
13 int n[MAX_E];
14 int w[MAX_E];
15 int t[MAX_E];
16 int max_w = 1;;
17 int min_w = 1000000;
18 
19 bool check(int l) {
20   queue<pair<int, int> > q;
21   memset(v, 0, sizeof(v));
22   q.push(pair<int, int>(1, K));
23   while (!q.empty()) {
24     pair<int, int> p = q.front();
25     q.pop();
26     if (p.first == T && p.second >= 0)
27       return true;
28     if (p.second == 0 || v[p.first])
29       continue;
30     v[p.first] = true;
31     for (int i = f[p.first]; i != 0; i = n[i]) {
32       if (w[i] > l || v[t[i]])
33         continue;
34       q.push(pair<int, int>(t[i], p.second - 1));
35     }
36   }
37   return false;
38 }
39 
40 int find(int l, int r) {
41   int res = r;
42   while (l <= r) {
43     int m = (l + r) / 2;
44     if (check(m)) {
45       res = m;
46       r = m - 1;
47     }
48     else
49       l = m + 1;
50   }
51   return res;
52 }
53 
54 int main() {
55   memset(n, 0, sizeof(n));
56   scanf("%d%d%d%d", &N, &M, &K, &T);
57   for (int i = 0, j = 0; i < M; i++) {
58     int a, b, c;
59     scanf("%d%d%d", &a, &b, &c);
60     min_w = min(min_w, c);
61     max_w = max(max_w, c);
62     j++;
63     w[j] = c;
64     t[j] = b;
65     n[j] = f[a];
66     f[a] = j;
67     j++;
68     w[j] = c;
69     t[j] = a;
70     n[j] = f[b];
71     f[b] = j;
72   }
73   if (T == 1)
74     printf("0\n");
75   else
76     printf("%d\n", find(min_w, max_w));
77   return 0;
78 }

 

hihoCoder#1139 二分·二分答案

标签:

原文地址:http://www.cnblogs.com/boring09/p/4415792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!