• 南洋理工 OJ 115 城市平乱 dijstra算法


    城市平乱

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。

    他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。

    现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。

    现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。

    注意,两个城市之间可能不只一条路。

     
    输入
    第一行输入一个整数T,表示测试数据的组数。(T<20)
    每组测试数据的第一行是四个整数N,M,P,Q(1<=N<=100,N<=M<=1000,M-1<=P<=100000)其中N表示部队数,M表示城市数,P表示城市之间的路的条数,Q表示发生暴乱的城市编号。
    随后的一行是N个整数,表示部队所在城市的编号。
    再之后的P行,每行有三个正整数,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之间的路如果行军需要用时为t

    数据保证暴乱的城市是可达的。
    输出
    对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
    样例输入
    1
    3 8 9 8
    1 2 3
    1 2 1
    2 3 2
    1 4 2
    2 5 3
    3 6 2
    4 7 1
    5 7 3
    5 8 2
    6 8 2 
    样例输出
    4
    来源
    《世界大学生程序设计竞赛高级教程·第一册》改编
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define inf 0xfffff
     4 
     5 int g[1002][1002];
     6 int lowcost[1000001],used[1000001];
     7 
     8 void dijskra(int n,int a)
     9 {
    10     int i,j,k,min;
    11     memset(used,0,sizeof(used));
    12     memset(lowcost,0,sizeof(lowcost));
    13     for(i=1;i<=n;i++)
    14     lowcost[i]=g[i][a];
    15     used[a]=1;
    16     for(i=1;i<n;i++)
    17     {
    18         j=a;
    19         min=inf;
    20         for(k=1;k<=n;k++)
    21         {
    22             if(lowcost[k]<min&&!used[k])
    23             {
    24             min=lowcost[k];
    25             j=k;
    26             }
    27         }
    28         used[j]=1;
    29         for(k=1;k<=n;k++)
    30         {
    31             if(lowcost[j]+g[k][j]<lowcost[k]&&!used[k])
    32             lowcost[k]=lowcost[j]+g[k][j],
    33             g[k][a]=g[a][k]=lowcost[k];
    34         }
    35     }    
    36 }
    37 
    38 int main()
    39 {
    40     int n,m,p,q,i,j,t;
    41     int army;
    42     scanf("%d",&t);
    43     while(t--)
    44     {
    45     scanf("%d%d%d%d",&n,&m,&p,&q);
    46     for(i=1;i<=m+1;i++)
    47     {
    48         for(j=1;j<=m+1;j++)
    49         {
    50             g[i][j]=inf;
    51         }
    52         g[i][i]=0;
    53     }
    54     for(i=0;i<n;i++)
    55     {
    56         scanf("%d",&army);
    57         g[army][m+1]=g[m+1][army]=0;    
    58     }
    59     for(i=0;i<p;i++)
    60     {
    61         int a,b,t;
    62         scanf("%d%d%d",&a,&b,&t);
    63         g[a][b]=g[b][a]=t;    
    64     }    
    65     dijskra(m+1,m+1);
    66     printf("%d
    ",g[q][m+1]);
    67     }
    68 }
    View Code
  • 相关阅读:
    P3368 【模板】树状数组 2
    P3374 【模板】树状数组 1
    BZOJ 2654
    BZOJ 1016
    BZOJ 4870
    BZOJ 4868
    BZOJ 1503
    P3379 【模板】最近公共祖先(LCA)
    雅礼2017国庆1-1
    使用 CefSharp 网页显示问题
  • 原文地址:https://www.cnblogs.com/zeze/p/chenshioinglua.html
Copyright © 2020-2023  润新知