upc组队赛6 Bumped!【最短路】

Bumped!

题目描述

Peter returned from the recently held ACM ICPC World finals only to find that his return flight was overbooked and he was bumped from the flight! Well, at least he wasn’t beat up by the
airline and he’s received a voucher for one free flight between any two destinations he wishes.
He is already planning next year’s trip. He plans to travel by car where necessary, but he may be using his free flight ticket for one leg of the trip. He asked for your help in his planning.
He can provide you a network of cities connected by roads, the amount it costs to buy gas for traveling between pairs of cities, and a list of available flights between some of those cities. Help Peter by finding the minimum amount of money he needs to spend to get from his hometown to next year’s destination!

输入

The input consists of a single test case. The first line lists five space-separated integers n, m, f, s, and t, denoting the number of cities n (0 < n ≤ 50 000), the number of roads m (0 ≤ m ≤ 150 000), the number of flights f (0 ≤ f ≤ 1 000), the number s (0 ≤ s < n) of the city in which Peter’s trip starts, and the number t (0 ≤ t < n) of the city Peter is trying to travel to. (Cities are numbered from 0 to n − 1.)
The first line is followed by m lines, each describing one road. A road description contains three space-separated integers i, j, and c (0 ≤ i, j < n, i 6= j and 0 < c ≤ 50 000), indicating there is a road connecting cities i and j that costs c cents to travel. Roads can be used in either direction for the same cost. All road descriptions are unique.
Each of the following f lines contains a description of an available flight, which consists of two space-separated integers u and v (0 ≤ u, v < n, u 6= v) denoting that a flight from city u to city v is available (though not from v to u unless listed elsewhere). All flight descriptions are unique.

输出

Output the minimum number of cents Peter needs to spend to get from his home town to the competition,using at most one flight. You may assume that there is a route on which Peter can reach his destination.

样例输入

8 11 1 0 5
0 1 10
0 2 10
1 2 10
2 6 40
6 7 10
5 6 10
3 5 15
3 6 40
3 4 20
1 4 20
1 3 20
4 7

样例输出

45

题意

n个点,m条边,f条飞行路线,s起始点,t终点

其中f条飞行路线可以使一条边的距离为0;

题解

这题很坑,相当坑,有如下几点

  1. 不管f有多少条 ,只能选一条 ,所以我们枚举每一条f边为0,去求最短路;

  2. 如果f=0,别直接不跑了

  3. 数据范围是long long ,如果初始化为INF 就会WA!! 太坑了! 改成9999999999或更多(在此WA了几百发,留下惨痛教训)

可以用map或者set来存

代码

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define rep(i,a,n) for(int i=a;i<n;++i)
#define readc(x) scanf("%c",&x)
#define read(x) scanf("%d",&x)
#define sca(x) scanf("%d",&x)
#define read2(x,y) scanf("%d%d",&x,&y)
#define read3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define print(x) printf("%d\n",x)
#define mst(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x&-x
#define lson(x) x<<1
#define rson(x) x<<1|1
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<ll,ll> P;
const int INF =0x3f3f3f3f;
const int inf =0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = 105;
const int maxn =1000010;
using namespace std;
struct node{
    ll to;
    ll cost;
    bool operator < (node b)const{
        return cost > b.cost;
    }
};
struct edge{
    ll to;
    ll cost;
};
vector<edge> E[maxn];
int vis[maxn];
ll dis[maxn];
priority_queue<node>q;
ll x,y,z;
ll n,m,f,st,ed;

void Dijkstra(ll s){
    memset(vis,0,sizeof vis);
    for(int i = 0; i < n; i++)
        dis[i] = 9999999999;
    while(!q.empty())
        q.pop();
    dis[s] = 0;
    q.push(node{s,0});
    node tmp;
    while(!q.empty()){
        tmp = q.top();
        q.pop();
        ll u = tmp.to;
        if(vis[u])
            continue;
        vis[u] = 1;
        for(int i = 0; i < E[u].size(); i++){
            ll v = E[u][i].to;
            ll w = E[u][i].cost;
            if(!vis[v] && dis[v] > dis[u] + w){
                dis[v] = dis[u] + w;
                q.push(node{v,dis[v]});
            }
        }
    }
}

int main(){
    scanf("%lld%lld%lld%lld%lld",&n,&m,&f,&st,&ed);
    while(m--){
        scanf("%lld%lld%lld",&x,&y,&z);
        E[x].pb(edge{y,z});
        E[y].pb(edge{x,z});
    }
    ll ans = 9999999999;
    Dijkstra(st);
    ans = dis[ed];
    while(f--){
        scanf("%lld%lld",&x,&y);
        E[x].pb(edge{y,0});
        Dijkstra(st);
        ans = min(ans,dis[ed]) ;
        E[x].erase(E[x].end() - 1);
    }
    printf("%lld\n",ans);
    return 0;
}
/*
6 7 2 0 5
0 1 10
0 3 5
1 4 10
2 3 5
0 5 100
4 5 5
2 5 5
0 2
1 3
*/
 
posted @ 2019-04-13 11:40  llke  阅读(187)  评论(0编辑  收藏  举报