zoukankan      html  css  js  c++  java
  • 【GMOJ3500】物语

    题目

    题目链接: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;
    }
    
  • 相关阅读:
    61. 最长不含重复字符的子字符串
    60. 礼物的最大价值 (未理解)
    59. 把数字翻译成字符串
    58. 把数组排成最小的数
    57. 数字序列中某一位的数字 (不懂)
    spring data jpa 官方文档
    idea 编译报错 源发行版 1.8 需要目标发行版 1.8
    idea maven 依赖报错 invalid classes root
    solr
    spring boot 官方文档
  • 原文地址:https://www.cnblogs.com/stoorz/p/12257465.html
Copyright © 2011-2022 走看看