1010: 好坑的电子地图

dij
memset(dist,0x3f,sizeof(dist)); 0x3f用于两个int相加不溢出,如果不怕遇到这种特殊情况,可以改成0x7f

#include <bits/stdc++.h>
using namespace std;
int n,m,s,t,a;
const int N=1010;
struct edge{
	int to;
	int w;
	bool operator<(const edge& a)const{
		return w>a.w;					//小根堆 
	}
};
int vis[N];
vector<edge> mp[N];
int dist[N];		//起点s到其他点的最短距离 
int dij(int s,int t,int a){
	priority_queue<edge> que;
	dist[s]=0;
	for(int i=0;i<mp[s].size();i++){
		que.push(mp[s][i]);
		dist[mp[s][i].to]=mp[s][i].w;
	}
	vis[s]=1;
	while(!que.empty()){
		auto now =que.top();
		que.pop();
		int id=now.to;
		int w=now.w;
		if(vis[id]==1){
			continue;
		}
		else if(w>a){
			return  a+1;	//肯定来不及了 
		}else if(id==t){
			return w;			//说明弹出边的终点就是t,且代价可接受 
		}else{
			vis[id]=1;
			for(int i=0;i<mp[id].size();i++){
				if(dist[mp[id][i].to]>dist[id]+mp[id][i].w){
					dist[mp[id][i].to]=dist[id]+mp[id][i].w;
					que.push({mp[id][i].to,dist[mp[id][i].to]});
				}
			}
		}
	}
	return a+1; 
}
int main(){
	while(scanf("%d%d%d%d%d",&n,&m,&s,&t,&a)!=EOF){
		for(int i=1;i<=N;i++)
			mp[i].clear();
		memset(dist,0x3f,sizeof(dist));
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=m;i++){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			if(u%2==0)
			 	mp[u].push_back({v,w+2});
			else
				mp[u].push_back({v,w+1});
			if(v%2==0)
			 	mp[v].push_back({u,w+2});
			else
				mp[v].push_back({u,w+1});
		}
		int ans=dij(s,t,a);
		if(ans<=a){
			printf("YES %d\n",ans);
		}
		else
			printf("KENG\n");
	}
}
posted @ 2026-03-14 14:49  peter_shen  阅读(10)  评论(0)    收藏  举报