版权声明:沃斯里德小浩浩啊 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;
}