原来做的时候,做到最后忘了找不到要输出-1
还是很粗心
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
#define LL long long
const int maxn = 1000 + 10;
const LL MM = 0x3f3f3f3f3f3f3f3f;
bool vis[maxn];
LL lcd[maxn];
LL n, m, x, y;
struct p{
LL v, w;
}lc[maxn];
vector<p>road[maxn];
vector<p>ma[maxn];///最终的图
/*void bfs(LL u, LL len){
//printf("in = %lld, len = %lld\n", u, len);
for(auto &y : road[u]){
// printf("u = %lld, v = %lld dis = %lld\n", u, y.v, y.w);
if(!vis[y.v]){///标志节点访问
if(len >= y.w){
// printf("now = %lld, to = %lld\n", u, y.v);
vis[y.v] = 1;
//printf("len = %lld\n", len-y.w);
bfs(y.v, len-y.w);
}
}
}
}*/
void spfa(LL s, vector<p> mm[]){
lcd[s] = 0;
queue<LL> q;
q.push(s);
while(!q.empty()){
LL t = q.front();
q.pop();
for(auto &y: mm[t]){
if(lcd[t] + y.w < lcd[y.v]){
lcd[y.v] = lcd[t] + y.w;
if(!vis[y.v]){
vis[y.v] = 1;
q.push(y.v);
}
}
}
vis[t] = 0;
}
}
void init(){
for(LL i = 0; i <= n; i++) lcd[i] = MM;
}
int main(){
while(scanf("%lld%lld", &n, &m) != EOF){
for(LL i = 0; i <= n; i++){
road[i].clear();
ma[i].clear();
}
scanf("%lld%lld", &x, &y);
LL u,v,w;
for(LL i = 1; i <= m; i++){
scanf("%lld%lld%lld", &u, &v, &w);
road[u].push_back(p{v,w});
road[v].push_back(p{u,w});
}
for(LL i = 1; i<= n; i++){
scanf("%lld%lld",&lc[i].v ,&lc[i].w);
}
for(LL i = 1; i<= n; i++){
//memset(vis, 0, sizeof(vis));
init();
spfa(i, road);
//bfs(i, lc[i].d);
for(LL j = 1; j <= n; j++){
if(lcd[j] <= lc[i].v && i != j){
// printf("j = %lld\n", j);
ma[i].push_back(p{j, lc[i].w});
}
}
}
// for(LL i = 1; i <= n; i++){
// for(auto &y: ma[i]){
// printf("u = %lld, v = %lld, cost = %lld\n", i, y.v, y.w);
// }
// }
memset(vis, 0, sizeof(vis));
init();
spfa(x, ma);
if(lcd[y] != MM)
printf("%lld\n", lcd[y]);
else
printf("-1\n");
}
return 0;
}