• 1378:最短路径(shopth)


    地址:http://ybt.ssoier.cn:8088/problem_show.php?pid=1378

    1.Dijkstra代码(50分)

    1 #include<bits/stdc++.h>
    2 #define INF 0x3f3f3f3f
    3 using namespace std;
    4
    5 int n,a;
    6 int mp[85][85];//图 (邻接矩阵)
    7 bool vis[85]={0};//访问标记
    8 int dis[85];//最短距离
    9
    10 void Dijkstra(int s){//核心代码
    11 //   memset(dis,INF,sizeof(dis));
    12     for(int i=1;i<=n;i++){
    13         dis[i]=INF;
    14     }
    15     dis[s]=0;
    16     for(int i=1;i<=n;i++){
    17         int u=-1,MIN=INF;
    18         for(int j=1;j<=n;j++){
    19             if(vis[j]==0 && dis[j]<MIN){
    20                 u=j;
    21                 MIN=dis[j];
    22             }
    23         }
    24         if(u==-1) return;
    25         vis[u]=1;
    26         for(int v=1;v<=n;v++){
    27             if(vis[v]==0 && mp[u][v]!=INF && dis[u]+mp[u][v]<dis[v]){
    28                 dis[v]=dis[u]+mp[u][v];
    29             }
    30         }
    31     }
    32 }
    33
    34 int main(){
    35     cin>>n;
    36     cin>>a;
    37     for(int i=1;i<=n;i++){//输入图,注意判断整数和字符
    38         for(int j=1;j<=n;j++){
    39             int c;
    40             if(scanf("%d",&c)==1) mp[i][j]=c;
    41             else mp[i][j]=INF;
    42         }
    43     }
    44     Dijkstra(a);//松弛
    45     for(int i=1;i<=n;i++){//(1 -> 5) = 9
    46         if(i==a) continue;
    47         cout<<'(';
    48         cout<<a;
    49         cout<<" -> ";
    50         cout<<i;
    51         cout<<") = ";
    52         cout<<dis[i]<<endl;
    53     }
    54     return 0;
    55 }

    2.Floyd代码(100分)

     1 #include<bits/stdc++.h>
     2 #define INF 0x3f3f3f3f
     3 using namespace std;
     4  5 int n,a;
     6 int mp[85][85];
     7  8 void Floyd(){//核心代码
     9   for(int k=1;k<=n;k++){
    10       for(int i=1;i<=n;i++){            
    11           for(int j=1;j<=n;j++){
    12               if(mp[i][j]>mp[i][k]+mp[k][j]) mp[i][j]=mp[i][k]+mp[k][j];
    13           }
    14       }
    15   }
    16 }
    17 18 int main()
    19 {
    20   cin>>n>>a;
    21   for(int i=1;i<=n;i++){//输入
    22       for(int j=1;j<=n;j++){
    23           int c;
    24           if(scanf("%d",&c)==1)
    25               mp[i][j]=c;
    26           else
    27               mp[i][j]=INF;
    28       }
    29   }
    30   Floyd();
    31   for(int i=1;i<=n;i++){//(1 -> 5) = 9
    32       if(i==a) continue;
    33       cout<<'(';
    34       cout<<a;
    35       cout<<" -> ";
    36       cout<<i;
    37       cout<<") = ";
    38       cout<<mp[a][i]<<endl;
    39   }
    40   return 0;
    41 }

     

  • 相关阅读:
    627. whose 和 who's
    628. why 和why not
    629 will: 各种用法tyg
    enChapter 3 Underlying Technologiesp
    使用VIEWER.JS进行简单的图片预览
    outlook2010设置失败后重新设置
    新增和编辑clob字段
    金钱大写
    pivot 与 unpivot 函数是SQL05新提供的2个函数
    从函数到委托
  • 原文地址:https://www.cnblogs.com/Wag-Ho/p/14529671.html
Copyright © 2020-2023  润新知