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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值