ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1396 营救+最短路

2020-04-18 19:52:51  阅读:254  来源: 互联网

标签:val P1396 短路 tot int read include 营救 dis


算法

最短路+变式

思路

我们仔细思考一下,对于任意一个点,到它的最大拥挤度的最小值肯定是与它相邻的一个点的此值和他们之间的边权值取一个max,然后在所有max中取一个min!

 

这样我们就可以想到只要把板子里的松弛稍微修改一下,即只需把原本的求和改为取max就ok了!

 

另,注意此题应构无向图!!

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;

const int M = 30001;
inline int read() {
    int ret;bool flag=0;char c;
    while((c=getchar())<'0'||c>'9')flag^=!(c^'-');ret=c^48;
    while((c=getchar())>='0'&&c<='9') ret=(ret<<3)+(ret<<1)+(c^48);
    return flag?-ret:ret;
}

queue <int> Q;
int fir[M>>1],nex[M],go[M],val[M];
int dis[M>>1],vis[M>>1];
int n,m,a,b,tot;

inline void add_edge(int x,int y,int z)
{
    nex[++tot] = fir[x],fir[x] = tot,go[tot] = y,val[tot] = z;
}


int main(void)
{
    n = read();m = read();a = read();b = read();
    for(int i = 1;i <= m; i++)
    {
        int x,y,z;
        x = read();y = read();z = read();
        add_edge(x,y,z);
        add_edge(y,x,z);
    }
    for(int i = 1;i <= n; i++) dis[i] = 1e9  + 7;
    dis[a] = 0;
    Q.push(a);
    vis[a] = 1;
    while(!Q.empty())
    {
        int Now = Q.front();
        Q.pop();
        int Go;
        vis[Now] = 0;
        for(int i = fir[Now];i,Go = go[i];i=nex[i])
        {
            if(dis[Go] > max(dis[Now],val[i]))
            {
                dis[Go] = max(dis[Now],val[i]);
                if(!vis[Go]) Q.push(Go),vis[Go]=1;
            }
        }
    }
    if(dis[b] == 1e9+7) dis[b] = -1;
    printf("%d",dis[b]);
    return 0;
}

  

  

 

#include <cstdio>#include <algorithm>#include <cstring>#include <queue>usingnamespace std; constint M = 30001; inlineintread() { int ret;bool flag=0;char c; while((c=getchar())<'0'||c>'9')flag^=!(c^'-');ret=c^48; while((c=getchar())>='0'&&c<='9') ret=(ret<<3)+(ret<<1)+(c^48); return flag?-ret:ret; } queue <int> Q; int fir[M>>1],nex[M],go[M],val[M]; int dis[M>>1],vis[M>>1]; int n,m,a,b,tot; inlinevoid add_edge(int x,int y,int z) { nex[++tot] = fir[x],fir[x] = tot,go[tot] = y,val[tot] = z; } int main(void) { n = read();m = read();a = read();b = read(); for(int i = 1;i <= m; i++) { int x,y,z; x = read();y = read();z = read(); add_edge(x,y,z); add_edge(y,x,z); } for(int i = 1;i <= n; i++) dis[i] = 1e9 + 7; dis[a] = 0; Q.push(a); vis[a] = 1; while(!Q.empty()) { int Now = Q.front(); Q.pop(); int Go; vis[Now] = 0; for(int i = fir[Now];i,Go = go[i];i=nex[i]) { if(dis[Go] > max(dis[Now],val[i])) { dis[Go] = max(dis[Now],val[i]); if(!vis[Go]) Q.push(Go),vis[Go]=1; } } } if(dis[b] == 1e9+7) dis[b] = -1; printf("%d",dis[b]); return0; }

标签:val,P1396,短路,tot,int,read,include,营救,dis
来源: https://www.cnblogs.com/ruanmowen/p/12727645.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有