zoukankan      html  css  js  c++  java
  • COGS 2. 旅行计划

    2. 旅行计划

    ★☆   输入文件:djs.in   输出文件:djs.out   简单对比
    时间限制:3 s   内存限制:128 MB

    过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距离及可行路线(可行路线有方向),如下图所示。请你编程计算从阿杜所住城市到其它城市的最短路径以帮助阿杜制定旅行计划。

    【输入格式】

    输入由若干行组成,第一行有三个整数,$n(1≤n≤100)、m(1≤m≤n^2)、v(1≤m≤n)$;城市数,$m$城市间道路数,$v$是阿杜所住城市。第$2$至$m+1$行是每条路的信息,每行三个整数,为道路的起点、终点和两城市间距离。(城市从0开始编号)

    【输出格式】

    n组(按城市编号由小至大),每组三行

    第一行:城市编号及一个冒号

    第二行:path及一个冒号,后面是最短路径节点编号序列(编号间用一个空格隔开)

    第三行:cost及一个冒号,后面是一个整数,表示路径距离

    如果没有通路则输出 no

    【输入样例】

    6 8 0
    0 2 10
    0 4 30
    0 5 100
    1 2 5
    2 3 50
    3 5 10
    4 3 20
    4 5 60

    【输出样例】

    0:
    no
    1:
    no
    2:
    path:0 2
    cost:10
    3:
    path:0 4 3
    cost:50
    4:
    path:0 4
    cost:30
    5:
    path:0 4 3 5
    cost:60

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define pir pair<int,int>
    using namespace std;
    const int N=1e5+10;
    struct node{
        int v,w,next;
    }e[N<<1];
    int tot,head[N];
    int n,m,S,dis[N],qq[N];
    bool vis[N];
    void add(int x,int y,int z){
        e[++tot].v=y;
        e[tot].w=z;
        e[tot].next=head[x];
        head[x]=tot;
    }
    void dijkstra(){
        priority_queue<pir,vector<pir>,greater<pir> >q;
        memset(dis,0x3f3f3f3f,sizeof dis);
        q.push(make_pair(dis[S]=0,S));
        while(!q.empty()){
            pir h=q.top();q.pop();
            int x=h.second;
            if(vis[x]) continue;
            vis[x]=1;
            for(int v,w,i=head[x];i;i=e[i].next){
                v=e[i].v;w=e[i].w;
                if(!vis[v]&&dis[v]>dis[x]+w){
                    q.push(make_pair(dis[v]=dis[x]+w,v));
                    qq[v]=x;
                }
            }
        } 
    }
    void out(int x){
        if(qq[x]==-1) return ;
        out(qq[x]);
        printf("%d ",x);
    }
    int main(){
        freopen("djs.in","r",stdin);
        freopen("djs.out","w",stdout);
        memset(qq,-1,sizeof qq);
        scanf("%d%d%d",&n,&m,&S);
        for(int i=1,x,y,z;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
        }
        dijkstra();
        for(int i=0;i<n;i++){
            if(i==S) printf("%d:
    no
    ",S);
            else if(dis[i]==0x3f3f3f3f) printf("%d:
    no
    ",i);
            else{
                printf("%d:
    ",i);
                printf("path:%d ",S);out(i);putchar('
    ');
                printf("cost:%d
    ",dis[i]);
            }
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    debian下使用mplayer
    Linux缺点要挟网银平安 SSL证书遽需改换
    linux用C如何鉴别一个目录能否为空
    Ubuntu旗舰版(Ultimate)1.8
    Linux系统下IP以及DNS设置方法
    升级firefox 3.0 beta 到RC1
    微星下月推Wind超低价NB 可运转XP和Linux
    Linux下hosts、host.conf、resolv.conf的区别
    传华硕将在6月3日闪现EBox台式电脑
    linux批改ssh端口和避免root远程上岸设置
  • 原文地址:https://www.cnblogs.com/shenben/p/6045921.html
Copyright © 2011-2022 走看看