Kattis - bumped B - Bumped! (最短路)

版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/83244396

链接:

https://cn.vjudge.net/problem/1153076/origin

题意:

给出图,求起点到终点的最少花费,但是会提供给一些免费的机票(机票是单程的),你可以之多选择一张机票(当然可以不选),求所有选择中花费最少是多少。

思路:

迪杰斯特拉优化算法,先跑一边不用机票的情况(因为机票可能为0),然后朱哥枚举所有机票的最短路,取最小即可。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF  = 1e10;
const ll maxn = 150010;
struct qnode
{
    int v;
    ll c;
    qnode(int  _v = 0, ll _c = 0):v(_v),c(_c){}
    bool operator < (const qnode &r)const
    {
        return c > r.c;
    }
};
struct Edge
{
    int v;
    ll cost;
    Edge(int _v = 0,ll _cost = 0):v(_v),cost(_cost){}
};
vector<Edge> E[maxn];
bool vis[maxn];
ll dist[maxn];
void Dijkstra(int n,int start)
{
    memset(vis,0,sizeof vis);
    for(int i = 0 ; i < n; i++)
        dist[i] = INF;
    priority_queue<qnode> que;
    while(!que.empty()) que.pop();
    dist[start] = 0;
    que.push(qnode(start,0));
    qnode tmp;
    while(!que.empty())
    {
        tmp = que.top();
        que.pop();
        int u = tmp.v;
        if(vis[u]) continue;
        vis[u] = true;
        for(int  i = 0 ; i < E[u].size();i++)
        {
            int v = E[u][i].v;
            ll cost = E[u][i].cost;
            if(!vis[v]&&dist[v] > dist[u] + cost)
            {
                dist[v] = dist[u]  + cost;
                que.push(qnode(v,dist[v]));
            }
        }
    }
}
void addedge(int u ,int v, ll w)
{
    E[u].push_back(Edge(v,w));
}
int main()
{
    int n,m,f,s,t;
    ios::sync_with_stdio(false);
    cin>>n>>m>>f>>s>>t;
    for(int i = 0; i < m;i++)
    {
        int st,ed,c;
        cin>>st>>ed>>c;
        addedge(st,ed,c);
        addedge(ed,st,c);
    }
    ll mmin = INF;
    Dijkstra(n,s);
    mmin = min(mmin,dist[t]);
    for(int i = 0 ;i < f; i++)
    {
        int st,ed;
        cin>>st>>ed;
        addedge(st,ed,0);
        Dijkstra(n,s);
        mmin = min(mmin , dist[t]);
        E[st].erase(E[st].end()-1);
    }
        cout<<mmin<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Healer66/article/details/83244396