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

浙公网安备 33010602011771号