我是用的二分,这样似乎要慢点
并查集的那个没写。。
窝真的好菜。。
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX = 205;
const int MAXM = 1005;
int spd[MAXM];
bool vis[MAX];
struct _edge {
int to, spd;
};
vector<_edge> mp[MAX];
void init(int n){
for(int i = 0; i <= n; ++i)
mp[i].clear();
}
bool bfs(int s, int t, int l, int h) {
memset(vis, false, sizeof(vis));
vis[s] = true;
queue<int> tag;
tag.push(s);
int sz, to, tp;
while(!tag.empty()){
tp = tag.front();
tag.pop();
sz = mp[tp].size();
for(int i = 0; i < sz; ++i){
_edge& e = mp[tp][i];
if(vis[e.to] || e.spd < l || e.spd > h)
continue;
if(e.to == t)
return true;
vis[e.to] = true;
tag.push(e.to);
}
}
return false;
}
int main() {
int n, m, q, s, t, sp;
while(~scanf("%d%d", &n, &m)){
int mx = 0;
init(n);
for(int i = 0; i < m; ++i){
scanf("%d%d%d", &s, &t, &sp);
mp[s].push_back((_edge){t, sp});
mp[t].push_back((_edge){s, sp});
spd[i] = sp;
mx = max(mx, sp);
}
sort(spd, spd + m);
scanf("%d", &q);
while(q --){
scanf("%d%d", &s, &t);
int l = 0, r = mx, mid, ans = -1;
bool ok = false;
while(l <= r){
mid = (l + r) >> 1;
ok = false;
for(int i = 0; spd[i] + mid < mx; ++i){
if(bfs(s, t, spd[i], spd[i] + mid)){
ok = true;
break;
}
}
if(ok){
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
printf("%d\n", ans);
}
}
return 0;
}