求最短路 中的最大边最小

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\n",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;
        }
    }
    
 } 

 

posted @ 2018-08-30 15:53  踩在浪花上  阅读(234)  评论(0编辑  收藏  举报