题目链接:UVA-11374-Airport Express
题意是给定一个图。然后给定一些快速路径,你最多通过一次快速路径。求从起点到终点的最短距离。
首先求出f[i]和g[i],即i点到起点和终点的最短路。
然后枚举所有的快速路径
(u,v)
ans=min(ans,min(f[u]+g[v]+cost,f[v]+g[u]+cost))
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int v,d;
Node(int _v,int _d):v(_v),d(_d){}
bool operator < (const Node & r) const
{
return d>r.d;
}
};
vector<Node> adj[507];
bool vis[507];
int f[507],g[507];
int pref[507],preg[507];
void dij(int *d,int *pre,int s)
{
priority_queue<Node> q;
d[s]=0;
q.push(Node(s,0));
pre[s]=0;
while(!q.empty())
{
Node t=q.top();q.pop();
if(vis[t.v]) continue;
//printf("%d\n",t.v);
vis[t.v]=true;
for(int i=0;i<adj[t.v].size();i++)
{
Node &next=adj[t.v][i];
if(!vis[next.v]&&d[next.v]>d[t.v]+next.d)
{
pre[next.v]=t.v;
d[next.v]=d[t.v]+next.d;
q.push(Node(next.v,d[next.v]));
}
}
}
}
deque<int> order;
int ans,st;
void update(int u,int v,int c)
{
int res=f[u]+g[v]+c;
//printf("%d\n",res);
if(res<ans)
{
ans=res;
st=u;
order.clear();
int t=u;
while(t!=0)
{
order.push_front(t);
t=pref[t];
}
t=v;
while(t!=0)
{
order.push_back(t);
t=preg[t];
}
}
}
int main()
{
int n,s,e;
int kase=0;
while(~scanf("%d%d%d",&n,&s,&e))
{
if(kase++) puts("");
for(int i=1;i<=n;i++) adj[i].clear();
int k,u,v,d;
scanf("%d",&k);
while(k--)
{
scanf("%d%d%d",&u,&v,&d);
adj[u].push_back(Node(v,d));
adj[v].push_back(Node(u,d));
}
ans=0x3f3f3f3f;
memset(f,0x3f,sizeof(f));
memset(g,0x3f,sizeof(g));
memset(vis,0,sizeof(vis));
dij(f,pref,s);
memset(vis,0,sizeof(vis));
dij(g,preg,e);
scanf("%d",&k);
while(k--)
{
scanf("%d%d%d",&u,&v,&d);
update(u,v,d);
update(v,u,d);
}
if(f[e]<ans)
{
order.clear();
int t=e;
while(t!=0)
{
order.push_front(t);
t=pref[t];
}
while(!order.empty())
{
printf("%d",order.front());
order.pop_front();
printf("%c",order.empty()?'\n':' ');
}
puts("Ticket Not Used");
printf("%d\n",f[e]);
}
else
{
while(!order.empty())
{
printf("%d",order.front());
order.pop_front();
printf("%c",order.empty()?'\n':' ');
}
printf("%d\n%d\n",st,ans);
}
}
return 0;
}