zoukankan      html  css  js  c++  java
  • [LUOGU] P1396 营救

    题目描述
    “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门……
    
    妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在s区。
    
    该市有m条大道连接n个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从st的路线,使得经过道路的拥挤度最大值最小。
    
    输入输出格式
    输入格式:
    第一行四个数字nmst。
    
    接下来m行,每行三个数字,分别表示两个区和拥挤度。
    
    (有可能两个区之间有多条大道相连。)
    
    输出格式:
    输出题目要求的拥挤度。
    
    输入输出样例
    输入样例#1: 复制
    3 3 1 3                         
    1 2 2
    2 3 1
    1 3 3
    输出样例#1: 复制
    2
    说明
    数据范围
    
    30% n<=10
    
    60% n<=100
    
    100% n<=10000,m<=2n,拥挤度<=10000
    
    题目保证1<=s,t<=ns<>t,保证可以从s区出发到t区。
    
    样例解释:
    
    小明的妈妈要从1号点去3号点,最优路线为1->2->3

    最短路里,要求出最长的一条边,一开始想到存下最短路路径,再遍历路径找最小值,后来发现可以把dis数组定义为最大值,所以在松弛的时候只需要把加号改成最大值就可以了,注意无向图两倍大小的数组。

    #include<iostream>
    #include<cstring>
    #include<queue>
    #define MAXN 400005
    #define INF 0x3ffffff
    using namespace std;
    
    int ans;
    int m,n,st,aim;
    struct Edge {
        int to,next,w;
    } e[MAXN];
    int head[MAXN],ecnt;
    inline void add(int x,int y,int w) {
        e[++ecnt].to = y;
        e[ecnt].w = w;
        e[ecnt].next = head[x];
        head[x]=ecnt;
    }
    
    struct Node {
        int id,w;
        bool operator< (const Node &rhs) const {
            return this->w>rhs.w ;
        }
    
    } ntop,node;
    
    int dis[MAXN];
    bool vis[MAXN];
    void dij() {
        priority_queue<Node> Q;
        for(int i=1; i<=n; i++) if(i!=st) {
                node.id = i;
                node.w = INF;
                Q.push(node);
                dis[i]=INF;
            }
        node.id = st;
        node.w = 0;
        Q.push(node);
        int t=n-1;
        for(int t=1; t<=n; t++) {
            do {
                ntop=Q.top() ;
                Q.pop() ;
            } while(vis[ntop.id ]);
            vis[ntop.id]=1;
            for(int i=head[ntop.id ]; i!=-1; i=e[i].next) {
                int v=e[i].to ;
                if(dis[v]>max(ntop.w , e[i].w )) {
                    dis[v]=max(ntop.w , e[i].w );
                    ans=max(max(ans,ntop.w),e[i].w);
                    node.id = v;
                    node.w = dis[v];
                    Q.push(node);
                }
            }
        }
    
    }
    
    int main() {
        memset(head,-1,sizeof(head));
        cin>>n>>m>>st>>aim;
        int x,y,w;
        for(int i=1; i<=m; i++) {
            cin>>x>>y>>w;
            add(x,y,w);
            add(y,x,w);
        }
        dij();
        cout<<dis[aim];
        return 0;
    
    }

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247502.html

  • 相关阅读:
    使用MFC开发的一个U盘后台拷贝程序
    cpp和c编译区别extern
    VC++的一个类中调用另一个类的变量
    科技创新项目基本知识学习(1) (07年10月2日)
    【原创】斌伯的DirectX学习笔记(2)DirectX的初始化化(10.19 下午)
    【原创】斌伯的DirectX学习笔记——引子
    斌伯的博客园Blog开张大吉
    科技创新项目开始(07年10月2日)
    小哈学Python第二课:Hello Word
    小哈学Python第一课:基本介绍
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247502.html
Copyright © 2011-2022 走看看