2017多校-10

来源:互联网 发布:最好的中国象棋软件 编辑:程序博客网 时间:2024/06/09 02:14

Two Paths
http://acm.hdu.edu.cn/showproblem.php?pid=6181
次短路(代码上网搜的模板)。。。开始INF=le9一直超时,看到评论区有人讨论,改为le18就过了。。。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#define LL long long#define MAXN 100005#define INF 1e18using namespace std;struct node{    LL v, w, next;} edge[MAXN * 2];LL n, m, e, p, q;LL vis[MAXN], dis[MAXN], disr[MAXN], head[MAXN];void insert(LL x, LL y, LL w){    edge[e].v = y;    edge[e].w = w;    edge[e].next = head[x];    head[x] = e++;}void spfa(LL src, LL d[]){    memset(vis, 0, sizeof(vis));    vis[src] = 1;    d[src] = 0;    queue<LL> Q;    Q.push(src);    while(!Q.empty())    {        p = Q.front();        Q.pop();        vis[p] = 0;        for(LL i = head[p]; i != -1; i = edge[i].next)        {            LL v = edge[i].v;            LL w = edge[i].w;            if(d[v] > d[p] + w)            {                d[v] = d[p] + w;                if(!vis[v])                {                    vis[v] = 1;                    Q.push(v);                }            }        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        LL a, b,c;        scanf("%lld%lld", &n, &m);        e = 0;        memset(head, -1, sizeof(head));        memset(dis, 0x3f, sizeof(dis));        memset(disr, 0x3f, sizeof(dis));        for(LL i = 0; i < m; i++)        {            scanf("%lld%lld%lld", &a, &b, &c);            insert(a, b, c);            insert(b, a, c);        }        spfa(1, dis);        spfa(n, disr);        LL mini = dis[n];        LL ans = INF;        for(LL i = 1; i <= n; i++)        {            for(LL j = head[i]; j != -1; j = edge[j].next)            {                LL v = edge[j].v;                LL w = edge[j].w;                if(dis[i] + disr[v] + w > mini && dis[i] + disr[v] + w < ans)                    ans = dis[i] + disr[v] + w;            }        }        printf("%lld\n",ans);    }    return 0;}
原创粉丝点击