挺简单一道题,结果因为一时傻逼写错一个小地方,导致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 }
时间: 2025-01-12 08:44:02