• hdu 1548 最短路


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

    就是Dijkstra算法的应用。。。。不过被坑了好久,原来电梯的up、down是并列的,初始化的时候出错了。。。。调了好半天。。突然醒悟过来了,,,orz

    View Code
     1 #include<iostream>
     2 #include<cstring>
     3 const int N=220;
     4 const int inf=1000000;
     5 using namespace std;
     6 
     7 int edge[N][N];
     8 int dist[N];
     9 int visited[N];
    10 int n,A,B;
    11 
    12 /*
    13 void floyd(){
    14     for(int k=1;k<=n;k++){
    15         for(int i=1;i<=n;i++){
    16             for(int j=1;j<=n;j++){
    17                 if(edge[i][k]+edge[k][j]<edge[i][j]){
    18                     edge[i][j]=edge[i][k]+edge[k][j];
    19                     path[i][j]=path[i][k];
    20                 }
    21             }
    22         }
    23     }
    24     if(edge[A][B]==inf){
    25         printf("-1\n");
    26     }else {
    27         int count=1;
    28         int k=A;
    29         while(path[k][B]!=B){
    30             k=path[k][B];
    31             count++;
    32         }
    33         printf("%d\n",count);
    34     }
    35 }*/
    36 
    37 void Dijkstra(int v0){
    38     memset(visited,0,sizeof(visited));
    39     for(int i=1;i<=n;i++){
    40         dist[i]=edge[v0][i];
    41     }
    42     dist[v0]=0;
    43     visited[v0]=1;
    44     for(int i=1;i<n;i++){
    45         int min=inf,u=v0;
    46         for(int j=1;j<=n;j++){
    47             if(!visited[j]&&dist[j]<min){
    48                 u=j,min=dist[j];
    49             }
    50         }
    51         if(min==inf)return ;
    52         visited[u]=1;
    53         for(int k=1;k<=n;k++){
    54             if(!visited[k]&&edge[u][k]<inf&&edge[u][k]+dist[u]<dist[k]){
    55                 dist[k]=dist[u]+edge[u][k];
    56             }
    57         }
    58     }
    59 }
    60 
    61 int main(){
    62     while(scanf("%d",&n)!=EOF){
    63         if(n==0)break;
    64         for(int i=1;i<=n;i++){
    65             for(int j=1;j<=n;j++){
    66             //    path[i][j]=j;//此时为顺序输出
    67                 if(i==j){
    68                     edge[i][j]=0;
    69                 }else 
    70                     edge[i][j]=inf;
    71             }
    72         }
    73         int num;
    74         scanf("%d%d",&A,&B);
    75         for(int i=1;i<=n;i++){
    76             scanf("%d",&num);
    77             if(i+num<=n)edge[i][i+num]=1;//两个状态时并列的,orz。。。
    78             if(i-num>=1)edge[i][i-num]=1;//
    79         }
    80         //floyd();
    81         Dijkstra(A);
    82         if(dist[B]<inf){
    83             printf("%d\n",dist[B]);
    84         }else 
    85             printf("-1\n");
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    PHP IDE NetBeans代码主题和除掉竖线解决方案
    初识Python
    从LazyPhp说起
    从Pycharm说起
    准备系统地研究一下"高性能网站开发",挑战很大,希望能坚持到底!
    IIS日志分析[资源]
    见一好东西:Threaded WebDownload class with Progress Callbacks
    ASP.net Application 中使用域用户登录
    看图找错
    汉字转拼音缩写的函数(C#)
  • 原文地址:https://www.cnblogs.com/wally/p/2882681.html
Copyright © 2020-2023  润新知