码迷,mamicode.com
首页 > 其他好文 > 详细

【GMOJ3500】物语

时间:2020-02-03 22:52:56      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:span   mem   --   uri   freopen   long   scanf   amp   type   

题目

题目链接:https://gmoj.net/senior/#main/show/3500
给定一张无向图,其中一条边的边权是不定的。接下来\(q\)组询问,每次给出这条边的边权,输出此时\(1\to n\)的最短路。

思路

\(1\)\(n\)开始分别跑一边\(dij\)
最终在\(dis[1][n],dis[1][u]+w+dis[v][n],dis[1][v]+w+dis[v][n]\)中取\(min\)即可。
答案为\(+Inf\)的充要条件是图不连通。

代码

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mp make_pair
using namespace std;
typedef long long ll;

const int N=5000010;
const ll Inf=1e16;
int n,m,Q,tot,head[N];
ll ans,dis[3][N];
bool vis[N];

struct edge
{
    int next,to,dis;
}e[N];

void add(int from,int to,int dis)
{
    e[++tot].to=to;
    e[tot].dis=dis;
    e[tot].next=head[from];
    head[from]=tot;
}

void dij(int s,int id)
{
    memset(vis,0,sizeof(vis));
    //memset(dis[id],0x3f3f3f3f,sizeof(dis[id]));
    for (int i=1;i<=n;i++)
        dis[id][i]=Inf;
    priority_queue<pair<ll,int> > q;
    q.push(mp(0,s));
    dis[id][s]=0;
    while (q.size())
    {
        int u=q.top().second;
        q.pop();
        if (vis[u]) continue;
        vis[u]=0;
        for (int i=head[u];~i;i=e[i].next)
        {
            int v=e[i].to;
            if (dis[id][v]>dis[id][u]+e[i].dis)
            {
                dis[id][v]=dis[id][u]+e[i].dis;
                q.push(mp(-dis[id][v],v));
            }
        }
    }
}

int main()
{
    freopen("monogatari.in","r",stdin);
    freopen("monogatari.out","w",stdout);
    memset(head,-1,sizeof(head));
    scanf("%d%d%d",&n,&m,&Q);
    for (int i=1,x,y,d;i<m;i++)
    {
        scanf("%d%d%d",&x,&y,&d);
        add(x,y,d); add(y,x,d);
    }
    dij(1,1); dij(n,2);
    int u,v,d;
    scanf("%d%d",&u,&v);
    while (Q--)
    {
        scanf("%d",&d);
        ans=min(dis[1][n],min(dis[1][u]+dis[2][v]+d,dis[1][v]+dis[2][u]+d));
        if (ans<Inf) printf("%lld\n",ans);
            else printf("+Inf\n");
    }
    return 0;
}

【GMOJ3500】物语

标签:span   mem   --   uri   freopen   long   scanf   amp   type   

原文地址:https://www.cnblogs.com/stoorz/p/12257465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!