COGS 826. [Tyvj Feb11] GF打dota (K短路)

来源:互联网 发布:淘宝兼职群 编辑:程序博客网 时间:2024/05/04 14:50

题目描述

传送门

题解

K短路板子题

代码

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#define N 100003#define inf 1000000000using 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);    }} 
0 0
原创粉丝点击