• hdu2680 Choose the best route


    多点到一点的最短距离,因为点的编号是从1到n所以把0作为新的起点

    将所有可能的起点跟0连接,转换为求单源最短路径用dijkstra即可。

    1 #include <stdio.h>
    2 #include <string.h>
    3
    4  #define INF 999999999
    5  #define MAX 1007
    6
    7 int n,map[MAX][MAX];
    8 int dijkstra(int str, int end){
    9 bool hash[MAX];
    10 int i,min,path[MAX];
    11
    12 for(i = 0; i <= n; i++){
    13 hash[i] = true;
    14 path[i] = INF;
    15 }
    16 hash[str] = false;
    17 path[str] = 0;
    18 while(str != end){
    19 for(i = 0; i <= n; i++){
    20 if(map[str][i])
    21 if(path[i] > path[str] + map[str][i])
    22 path[i] = path[str] + map[str][i];
    23 }
    24
    25 min = INF;
    26 for(i = 0; i <= n; i++){
    27 if(path[i] < min && hash[i]){
    28 min = path[i];
    29 str = i;
    30 }
    31 }
    32 if(min == INF)
    33 break;
    34 hash[str] = false;
    35 }
    36 return path[end];
    37 }
    38
    39 int main (void){
    40 int i,m,s,p,q,t,w,ans;
    41 while(scanf("%d%d%d",&n,&m,&s)!=EOF){
    42 memset(map,0,sizeof(map));
    43 for(i = 0; i < m; i++){
    44 scanf("%d%d%d",&p,&q,&t);
    45 if(!map[p][q])
    46 map[p][q] = t;
    47 else if(map[p][q] > t)
    48 map[p][q] = t;
    49 }
    50 scanf("%d",&w);
    51 for(i = 0; i < w; i++){
    52 scanf("%d",&q);
    53 map[0][q] = 1;
    54 }
    55 ans = dijkstra(0,s);
    56 if(ans != INF)
    57 printf("%d\n",ans - 1);
    58 else
    59 printf("-1\n");
    60 }
    61 return 0;
    62 }
  • 相关阅读:
    1204整理
    JDBC(与Orcale的连接)(转)
    Listener监听器详解(转)
    Filter过滤器详解(转)
    第十二章 存货
    会计基础 第一章 总论 部分复习题目
    会计基础 第一章 总论
    星座备考之狮子座如何复习会计从业资格考试
    会计基础第八章内容2
    何以解养老之忧
  • 原文地址:https://www.cnblogs.com/deadblue/p/2022158.html
Copyright © 2020-2023  润新知