• 求最短路 中的最大边最小


    http://47.93.252.151/problem.php?id=1150

    1150: 找面码

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 51  解决: 20
    [提交][状态][讨论版][命题人:16680340122]

    题目描述

    超和平Busters里的面码在这个城市里迷路了,仁太特别着急,面码很害怕一个人,所以仁太想快一点到达面码的身边,现在仁太手上只有一张地图,地图上标明了m条街道,连接着n个区 每条路都会有一个交通压力,现在仁太在s点,他知道面码在t点,请你帮仁太规划一条交通压力最小的路线使他快一点到达面码的身边并且使得经过道路的拥挤度最大值最小

    输入

    第一行四个数字n,m,s,t。

    接下来m 行 每行三个数字表示两个区和这条路的交通压力 两个区可能有多条路相连

    n<=10000,m<=2n,拥挤度<=10000

     

    输出

    输出题目要求的拥挤度

    说明: 题目保证可以从s出发到达t  且 1<=s.t<=n 

     

    样例输入

    3 3 1 3
    1 2 2
    2 3 1
    1 3 4
    

    样例输出

    2

    题意就是求一个最短路,这个最短路上的最大边最小
    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int to;
        int w;
    }pre[10002];
    vector<node>mp[10002];
    int vis[10002],dis[10002];
    int n,m,s,t;
    void djst()
    {
        memset(dis,0x3f3f3f,sizeof(dis));
        memset(vis,0,sizeof(vis));
        memset(pre,-1,sizeof(pre));
        dis[s]=0;
        while(1)
        {
            int k=-1,minn=0x3f3f3f;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&dis[i]<minn)
                k=i,minn=dis[i];
            }
            if(k==-1) break;
            vis[k]=1;
            for(int i=0;i<mp[k].size();i++)
            {
                int to=mp[k][i].to;
                if(dis[k]+mp[k][i].w<dis[to])
                {
                    dis[to]=dis[k]+mp[k][i].w;
                    pre[to].to=k;//为这一点的前驱为几 
                    pre[to].w=i;//在这个前驱下的第几个节点 
                }
                else if(dis[to]==dis[k]+mp[k][i].w)//记录最大前驱 
                {
                    if(mp[pre[to].to][pre[to].w].w>mp[k][i].w)//如果 距离都一样,就比较到这个点的以前的前驱的距离 和 现在到改点的距离 
                    {
                        pre[to].to=k;
                        pre[to].w=i;
                    }
                }
            }
        }
    }
    int main()
    {
        cin>>n>>m>>s>>t;
        int u,v,w;
        node tt;
        for(int i=1;i<=m;i++)
        {
            cin>>u>>v>>w;
            tt.to=v;
            tt.w=w;
            mp[u].push_back(tt);
            tt.to=u;
            mp[v].push_back(tt);
        }
        djst();
        int ans=0;
        for(int j=t;pre[j].to!=-1;j=pre[j].to)//从后往前找,不断找这个点的前驱 
        {
            ans=max(ans,mp[pre[j].to][pre[j].w].w);
        }
        printf("%d
    ",ans);
        return 0;
    }
    另一种写法
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 100010
    int fa[maxn]; 
    int find(int x)
    {
        return x==fa[x]?x:find(fa[x]);
    }
    int add(int x,int y)
    {
        int xx=find(x);
        int yy=find(y);
        if(xx!=yy)
        {
            fa[xx]=yy;
            return 1;
        }
        return 0;
     } 
     struct node{
         int x,y,z;
     }a[maxn];
     bool cmp(node a,node b)
     {
         return a.z<b.z;
     }
    int n,m,s,t;
    int main()
    {
        cin>>n>>m>>s>>t;
        for(int i=0;i<=n;i++) fa[i]=i;
        
        for(int i=1;i<=m;i++)
        {
            cin>>a[i].x>>a[i].y>>a[i].z;
        }
        sort(a+1,a+1+m,cmp);
        int l=0;
        for(int i=1;i<=m;i++)
        {
            if(l==n-1) break;
            if(add(a[i].x,a[i].y)){
                l++;
            }
            
            if(find(s) == find(t))
            {
                cout<<a[i].z<<endl;
                return 0;
            }
        }
        
     } 
  • 相关阅读:
    Netty源码分析之ByteBuf引用计数
    GitHub git push大文件失败(write error: Broken pipe)完美解决
    Windows10 Docker安装详细教程
    全面的Docker快速入门教程
    十本你不容错过的Docker入门到精通书籍推荐
    CentOS 8.4安装Docker
    postgres之一条sql查询总数及部分数据
    neo4j相关操作
    git上传大文件
    分布式文件系统fastdfs安装以及python调用
  • 原文地址:https://www.cnblogs.com/wpbing/p/9560655.html
Copyright © 2020-2023  润新知