1126 - 咸鱼旅行(最大路径最小值)

题目链接:http://www.ifrog.cc/acm/problem/1126

1126 - 咸鱼旅行

Time Limit:3s Memory Limit:128MByte

Submissions:580Solved:110

DESCRIPTION

这个地区可以看作是一个无向图,N个点M条边组成。每个边有一个边权。我们定义一条路径的花费,就是这条路径上最大的边权。
现在有一条咸鱼,想从S走到T,徒步旅行。
咸鱼于是找到了你,想让你告诉他从S到T的最小花费。

INPUT
第一行两个整数,N,M。满足(1 <= N <= 10^5, 0 <= M <= 5*10^5)接下来M行,每行三个整数U,V,C。表示有一个连接U点和V点的边,且边权是C。(1<=C<=10^9)接下来一个行是两个整数S,T(1<=S,T<=n)
OUTPUT
输出答案,如果S不能到达T,输出-1
SAMPLE INPUT
5 5
1 2 1
2 3 1
3 4 1
4 5 1
5 1 1
1 3
SAMPLE OUTPUT
1

解析:最短路问题,最大路径最小值,吃两次亏了,一次是2017-3-19 CCF D题写错成有向图(再加一条路径变成无向图就能得100分,结果20分),另外一次就是2017-5-27 蓝桥杯国赛第四题判断有无环,输出环所在的节点(又是硬生生的给写成有向图),这次玲珑杯河南专场,就算所有题都不写,也要过这个题,真是气人


代码:

#include<bits/stdc++.h>
#define N 100009
using namespace std;

struct node
{
    int v, w;
};

vector<node> T[N];

typedef pair<int, int> P;

inline void q_read(int &num)
{
    int f = 1; char ch;
    while(true)
    {
        ch = getchar();
        if(ch == '-') f = -1;
        if(isdigit(ch))
        {
            num = ch - '0';
            break;
        }
    }
    while(ch = getchar(), isdigit(ch)) num = num * 10 + ch - '0';
    num *= f;
}


int solve(int n, int S, int TT)
{
    int d[N];
    memset(d, 0x3f, sizeof(d));
    priority_queue<P, vector<P>, greater<P> > q;
    d[S] = 0;
    q.push(P(0, S));
    while(!q.empty())
    {
        P p = q.top(); q.pop();
        int v = p.second;
        if(d[v] < p.first) continue;
        for(int i = 0; i < T[v].size(); i++)
        {
            node &e = T[v][i];
            if(d[e.v] == 0x3f3f3f3f || d[e.v] > max(d[v], e.w))
            {
                d[e.v] = max(d[v], e.w);
                q.push(P(d[e.v], e.v));
            }
        }
    }
    return d[TT] == 0x3f3f3f3f ? -1: d[TT];
}


int main()
{
    int n, m, u, v, w, S, TT;
    q_read(n); q_read(m);
    for(int i = 1; i <= m; i++)
    {
        //scanf("%d%d%d", &u, &v, &w);
        q_read(u); q_read(v); q_read(w);
        T[u].push_back((node){v, w});
        T[v].push_back((node){u, w});
    }
    //scanf("%d%d", &S, &TT);
    q_read(S); q_read(TT);
    int ans = solve(n, S, TT);
    printf("%d\n", ans);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值