zoukankan      html  css  js  c++  java
  • 南洋理工 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
  • 相关阅读:
    Java Web Action DAO Service层次理解
    JSP/Servlet Web 学习笔记 DaySix —— EL表达式
    JSP/Servlet Web 学习笔记 DayFive
    JSP/Servlet Web 学习笔记 DayFour —— 实现一个简单的JSP/Servlet交互
    JSP/Servlet Web 学习笔记 DayFour
    如何快速创建百万级测试数据
    公司线上虚拟机大量GC导致STW和CPU飙升--抽丝剥茧定位的过程
    这10道springboot常见面试题你需要了解下
    这是一篇来源于阿里内部技术论坛的文章
    一文彻底弄懂如何选择抽象类还是接口
  • 原文地址:https://www.cnblogs.com/zeze/p/chenshioinglua.html
Copyright © 2011-2022 走看看