求最短路 中的最大边最小

Posted wpbing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最短路 中的最大边最小相关的知识,希望对你有一定的参考价值。

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;
        }
    }
    
 } 

 






以上是关于求最短路 中的最大边最小的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra算法求单源最短路

用C++求dijkstra算法求最短路径

POJ-2253 Frogger---最短路变形&&最大边的最小值

HDU - 3035 War(对偶图求最小割+最短路)

[算法学习]Bellman-Ford算法求最短路

POJ-2263 Heavy Cargo---最短路变形&&最小边的最大值