zoukankan      html  css  js  c++  java
  • 天梯L2-001. 紧急救援(25分)

    L2-001. 紧急救援

    时间限制
    200 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

    输入格式:

    输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

    输出格式:

    第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。

    输入样例:
    4 5 0 3
    20 30 40 10
    0 1 1
    1 3 2
    0 3 3
    0 2 2
    2 3 2
    
    输出样例:
    2 60
    0 1 3
    

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int INF = 99999999;
    int e[505][505];
    int d[505];
    int a[505];
    int v[505];
    int r[505];
    int su[505];
    int ans[505];
    int path[505];
    int sum=0;
    int m;
    int n = 0;
    void dijkstra(int s)
    {
        int i,j;
        for(i = 1 ; i <=n ; i++)  
        {  
            path[i]=s;
            d[i] = e[s][i];  
            if(s != i && e[s][i] != INF)  //如果可以走
            {  
                su[i] = r[i] + r[s];  
                ans[i] = 1;//初始化路数为1
            }  
        } 
        d[s]=0;
        v[s]=1;
        while(1)
        {
            int k=-1;
            int min = INF;
            for (j = 1; j <= n; j++)
            {
                if (v[j] == 0 && d[j] < min)
                {
                    min = d[j];
                    k = j;
                }
            }
            if(k==-1) break;
            v[k] = 1;//标记已被挑过
            for (j = 1; j <= n; j++)
            {
                if (!v[j]&&d[j] > d[k] + e[k][j])//利用k点对各个点松弛
                {
                    ans[j]=ans[k];//路数更新
                    d[j] = d[k] + e[k][j];
                    su[j]=su[k]+r[j];//人数更新
                    path[j]=k;//保存路径
                }
                else if(!v[j]&&d[j]==d[k]+e[k][j])
                {
                    ans[j]+=ans[k];//路数更新
                    if(su[j]<su[k]+r[j])
                    {
                        su[j]=su[k]+r[j];//人数更新
                        path[j]=k;//保存路径
                    }
    
                }
            }
        }
    
    }
    int main()
    {
        int i, j,s,d;
        cin>>n>>m>>s>>d;
        s++;//我是从1开始计数
        d++;
        memset(v, 0, sizeof(v));
        memset(ans, 0, sizeof(ans));
        memset(path, 0, sizeof(path));
        memset(su, 0, sizeof(su));
        for (i = 1; i <=n; i++)
        {
            for (j =1; j <=n; j++)
            {
                if (i == j) e[i][j] = 0;
                else e[i][j] = INF;
            }
        }
        for(int i=1;i<=n;i++) cin>>r[i];
        for (i = 1; i <= m; i++)
        {
            int x,y,k;
            cin >> x >> y >> k;
            x++;
            y++;
            if (e[x][y] > k)//两城市之间可能有多班公交
            {
                e[x][y] = k;
                e[y][x] = k;
            }
        }
        if(n == 1)  //特判,其实不考虑也能过
        {  
            printf("1 %d
    1", r[1]);  
            return 0;  
        }  
        dijkstra(s);
        int p[500],temp=d;
        int k=0;
        while(temp!=s) //输出路径
        {     
            p[k++]=temp;  
            temp=path[temp];  
        }  
        p[k]=s;
        cout<<ans[d]<<" "<<su[d]<<endl;
        for(i=k;i>=1;i--)
        {
            cout<<p[i]-1<<" ";
        }
        cout<<d-1<<endl;
    
        return 0;
    }

     

  • 相关阅读:
    数据处理:并行和性能 狼人:
    GTK+3.0终发布:诸多新特性亮相 狼人:
    微软:Windows 7 SP1将于本月正式发布 狼人:
    程序员的进化 狼人:
    TDD并不是看上去的那么美 狼人:
    Bing API 将新增 Bing 空间数据服务 狼人:
    微软产品组里的十一类人 狼人:
    Windows Phone 7“芒果”更新带来浏览器重大升级:IE Mobile 9 狼人:
    UI前沿技术:XNA颜色滚动程序 狼人:
    传递拷贝php 数组 传递 引用
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8635637.html
Copyright © 2011-2022 走看看