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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章