题目描述
传送门
题解
K短路板子题
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define N 100003
#define inf 1000000000
using namespace std;
struct data{
int g,h,x;
bool operator<(data const &a)const {
return g+h>a.g+a.h;
}
};
int point[N],len[N],v[N],nxt[N],dis[N],tot,n,m,can[N],ans,opt;
void add(int x,int y,int z)
{
tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; len[tot]=z;
tot++; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; len[tot]=z;
}
void spfa()
{
for (int i=1;i<=n;i++) dis[i]=inf;
dis[n]=0; can[n]=1;
queue<int> p; p.push(n);
while (!p.empty()) {
int now=p.front(); p.pop();
for (int i=point[now];i;i=nxt[i])
if (dis[v[i]]>dis[now]+len[i]) {
dis[v[i]]=dis[now]+len[i];
if (!can[v[i]]) {
can[v[i]]=1;
p.push(v[i]);
}
}
can[now]=0;
}
}
void Astar()
{
priority_queue<data> p;
data a,nt; a.x=1; a.g=0; a.h=dis[1];
p.push(a);
while (!p.empty()) {
data now=p.top(); p.pop();
if (now.x==n&&now.g!=ans) {
ans=now.g;
return;
}
for (int i=point[now.x];i;i=nxt[i]){
nt.x=v[i]; nt.g=now.g+len[i];
nt.h=dis[v[i]];
p.push(nt);
}
}
}
int main()
{
freopen("dota.in","r",stdin);
freopen("dota.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) {
int x,y,z; scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
spfa();
scanf("%d",&opt);
if (opt==0) printf("%d\n",dis[1]);
else{
ans=dis[1];
Astar();
printf("%d\n",ans);
}
}