CodeForces - 95C 最短路

原来做的时候,做到最后忘了找不到要输出-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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值