UVA-11374-Airport Express (最短路)

题目链接: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;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值