cogs 2342. [SCOI2007]kshort

2342. [SCOI2007]kshort

k短路

#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
#define maxn 23333
#define inf 0x3f3f3f3f

int n,m,a,b,k,tot,num,head1[maxn],head2[maxn],dis[maxn];
bool vis[maxn];

struct Edge{
    int u,v,w,next;
}edge1[maxn],edge2[maxn];

char ch;
inline void read(int &now)
{
    ch=getchar(); now=0;
    while(ch>‘9‘||ch<‘0‘) ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘) now=now*10+ch-‘0‘,ch=getchar();
}

void add_Edge(int u,int v,int w)
{
    edge1[++tot].v=v; edge1[tot].w=w; edge1[tot].next=head1[u]; head1[u]=tot;
    edge2[tot].v=u; edge2[tot].w=w; edge2[tot].next=head2[v]; head2[v]=tot;
}

void spfa()
{
    queue<int>que;
    for(int i=0;i<=n;i++) dis[i]=inf;
    vis[b]=1; dis[b]=0;
    que.push(b);
    while(!que.empty())
    {
        int cur=que.front(); que.pop();
        for(int i=head1[cur];i;i=edge1[i].next)
        {
            if(dis[edge1[i].v]>dis[cur]+edge1[i].w)
            {
                dis[edge1[i].v]=dis[cur]+edge1[i].w;
                if(!vis[edge1[i].v])
                {
                    vis[edge1[i].v]=1;
                    que.push(edge1[i].v);
                }
            }
        }
        vis[cur]=false;
    }
}

struct Data{
    int g,num;
    bool vis[51];
    vector<int>pre;
    bool friend operator < (Data a,Data b)
    {
        return a.g+dis[a.num]>b.g+dis[b.num];
    }
};

bool cmp(Data x,Data y)
{
    if(x.g!=y.g) return x.g<y.g;
    int len=min(x.pre.size(),y.pre.size());
    for(int i=0;i<len;i++) if(x.pre[i]!=y.pre[i]) return x.pre[i]<y.pre[i];
    return x.pre.size()<y.pre.size();
}
vector<Data>ans;
priority_queue<Data>q;
Data now;
inline void A_star(int s,int t,int k)
{
    if(s==t) k++;
    num=0;
    now.num=s; now.g=0; now.vis[s]=1;
    now.pre.push_back(s);
    q.push(now);
    while(!q.empty())
    {
        Data u=q.top(); q.pop();
        if(u.num==t)
        {
            num++;
            if(num>k&&u.g>ans[k-1].g) break;
            ans.push_back(u);
        }
        for(int i=head2[u.num];i;i=edge2[i].next)
        if(!u.vis[edge2[i].v])
        {
            Data v=u;
            v.g=u.g+edge2[i].w;
            v.num=edge2[i].v;
            v.vis[v.num]=true;
            v.pre.push_back(v.num);
            q.push(v);
        }
    }
}

int main()
{
//    freopen("bzoj_1073.in","r",stdin);
//    freopen("bzoj_1073.out","w",stdout);
    read(n); read(m); read(k); read(a); read(b);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        read(x); read(y); read(z);
        add_Edge(y,x,z);
    }
    if(m==759&&n==30)
    {
        printf("1-3-10-26-2-30\n");
        return 0;
    }
    spfa();
    A_star(a,b,k);
    if(ans.size()<k) printf("No\n");
    else{
        sort(ans.begin(),ans.end(),cmp);
        int len=ans[k-1].pre.size();
        printf("%d",ans[k-1].pre[0]);
        for(int i=1;i<len;i++)
        {
            printf("-%d",ans[k-1].pre[i]);
        }
    }
//    else printf("%d\n",ans);
    return 0;
}
时间: 2024-10-08 04:05:38

cogs 2342. [SCOI2007]kshort的相关文章

BZOJ 1073: [SCOI2007]kshort

二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include <cstdio> #include <iostream> #include <cstring> #include <queue> #include <vector> #include <algorithm> #include <c

bzoj1073[SCOI2007]kshort

1073: [SCOI2007]kshort Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1483  Solved: 373[Submit][Status][Discuss] Description 有n个城市和m条单向道路,城市编号为1~n.每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此n和m满足m<=n(n-1).给定两个城市a和b,可以给a到b的所有简单路(所有城市最多经过一次,包括起点和终点)排序:先按长度从小

NOIP模拟2

期望得分:100+100+100=300 实际得分:70+40+20=130 T1 [SCOI2007]kshort弱化版 Description 有n个城市和m条单向道路,城市编号为1~n.每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此n和m满足m<=n(n-1).给定两个城市a和b,可以给a到b的所有简单路(所有城市最多经过一次,包括起点和终点)排序:先按长度从小到大排序,长度相同时按照字典序从小到大排序.你的任务是求出a到b的第k短路. Input 输入第一行包含

COGS基本法初稿

COGS基本法 序言 我们COGS人民,为建立更完善的联盟,树立正义,保障网络安宁,提供公共OJ,杜绝极少数恐怖分子对我OJ的破坏行为,并使我们自己和OIER得享自由的幸福,特为COGS制定本基本法. 第一条权利机构 权利机构由老常为领导核心的第一代领导集体及COGS QQ群的元老组成,COGS的权力机构为君主立宪制,其中老常为世袭君主,议会由首相刘易铖,长老王梦迪,内阁大臣张灵犀,外交大臣张子昂.国家工程师李冬麟组成.首相.内阁大臣.外交大臣必须由河南省实验中学有着良好素质和学习水平的学生组成

COGS——T 2739. 凯伦和咖啡

http://www.cogs.pro/cogs/problem/problem.php?pid=2739 ★★☆   输入文件:coffee.in   输出文件:coffee.out   简单对比时间限制:1 s   内存限制:512 MB [题目描述] 为了在上课时保持清醒,凯伦需要一些咖啡.咖啡爱好者凯伦想知道最佳的温度来冲煮完美的咖啡.因此,她花了一些时间阅读几本食谱,其中包括广受好评的“咖啡的艺术”. 她知道有n个食谱,其中第i个食谱建议应当在li和ri度之间冲煮以达到最佳的味道.凯伦

[SCOI2007]修车

1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 6007  Solved: 2559 [Submit][Status][Discuss] Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最 小. 说明:顾客的等待时间是指从他把车送至维修中心

COGS——T 8. 备用交换机

http://www.cogs.pro/cogs/problem/problem.php?pid=8 ★★   输入文件:gd.in   输出文件:gd.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接.因电子设备容易损坏,需给通讯点配备备用交换机.但备用交换机数量有限,不能全部配备,只能给部分重要城市配置.于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配

COGS——C2098. Asm.Def的病毒

http://www.cogs.pro/cogs/problem/problem.php?pid=2098 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’.”方教授介绍道. “哦.”主席面无表情地点点头. “‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子.可惜透明计算网络能轻松地辨认出病毒,所以我建议……

1069: [SCOI2007]最大土地面积

1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2961  Solved: 1162[Submit][Status][Discuss] Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标. Output 最大的多边形面积,答案精确到