zoukankan      html  css  js  c++  java
  • 最短路(临街矩阵)

    最短路(临街矩阵)

    求最短路:

    输入数据:

    5 7
    1 2 2
    1 3 4
    1 4 7
    2 3 1
    2 5 2
    3 4 1
    3 5 6

    Floyed:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,m;
     4 int al[15][15];
     5 void printAL();
     6 void readData(){
     7     memset(al,0x7,sizeof(al));
     8     cin>>n>>m;
     9     for(int i=1;i<=n;i++) al[i][i]=0;
    10     for(int i=1;i<=m;i++){
    11         int a,b,w;
    12         cin>>a>>b>>w;
    13         al[a][b]=w;
    14         al[b][a]=w;
    15     }    
    16     
    17 }
    18 
    19 void floyed(){
    20     for(int k=1;k<=n;k++){
    21         for(int i=1;i<=n;i++){
    22             for(int j=1;j<=n;j++){
    23                 if(al[i][j]>al[i][k]+al[k][j]){
    24                     al[i][j]=al[i][k]+al[k][j];
    25                 }
    26             }
    27         }
    28     }
    29 }
    30 
    31 int main(){
    32     freopen("shu_in.txt","r",stdin);
    33     readData();
    34     printAL();
    35     floyed();
    36     printAL();
    37     return 0;
    38 } 
    39 
    40 
    41 
    42 
    43 
    44 void printAL(){
    45     for(int i=1;i<=n;i++){
    46         for(int j=1;j<=n;j++){
    47             cout<<setw(10)<<al[i][j]<<" ";
    48         }
    49         cout<<endl;
    50     }
    51     cout<<endl;
    52 }
    Floyed

    Dijkstra:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,m;
     4 int al[15][15];
     5 int dis[15];
     6 bool vis[15];
     7 void printAL();
     8 void printDIS();
     9 void readData(){
    10     memset(al,0x7,sizeof(al));
    11     cin>>n>>m;
    12     for(int i=1;i<=n;i++) al[i][i]=0;
    13     for(int i=1;i<=m;i++){
    14         int a,b,w;
    15         cin>>a>>b>>w;
    16         al[a][b]=w;
    17         al[b][a]=w;
    18     }    
    19     
    20 }
    21 
    22 void dijkstra(int start){
    23     for(int i=1;i<=n;i++) dis[i]=al[start][i];
    24     vis[start]=true;
    25     
    26     for(int k=1;k<=n-1;k++){
    27         int minv=0x37777777,min_i;
    28         for(int i=1;i<=n;i++){
    29             if(!vis[i]&&dis[i]<minv){
    30                 minv=dis[i];
    31                 min_i=i;
    32             }
    33         }
    34         vis[min_i]=true;
    35         for(int i=1;i<=n;i++){
    36             if(!vis[i]){
    37                 if(dis[i]>dis[min_i]+al[min_i][i]){
    38                     dis[i]=dis[min_i]+al[min_i][i];
    39                 }
    40             }
    41         }
    42     }
    43 
    44 }
    45 
    46 int main(){
    47     freopen("shu_in.txt","r",stdin);
    48     readData();
    49     printAL();
    50     dijkstra(1);
    51     printDIS();
    52     return 0;
    53 } 
    54 
    55 
    56 
    57 
    58 
    59 void printAL(){
    60     for(int i=1;i<=n;i++){
    61         for(int j=1;j<=n;j++){
    62             cout<<setw(10)<<al[i][j]<<" ";
    63         }
    64         cout<<endl;
    65     }
    66     cout<<endl;
    67 }
    68 void printDIS(){
    69     for(int i=1;i<=n;i++){
    70         cout<<setw(10)<<dis[i]<<" ";
    71     }
    72     cout<<endl;
    73 }
    Dijkstra

    Bellman-Ford:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,m;
     4 int al[15][15];
     5 int dis[15];
     6 void printAL();
     7 void printDIS();
     8 void readData(){
     9     memset(al,0x7,sizeof(al));
    10     cin>>n>>m;
    11     for(int i=1;i<=n;i++) al[i][i]=0;
    12     for(int i=1;i<=m;i++){
    13         int a,b,w;
    14         cin>>a>>b>>w;
    15         al[a][b]=w;
    16         al[b][a]=w;
    17     }    
    18     
    19 }
    20 
    21 void bellman(int start){
    22     for(int i=1;i<=n;i++) dis[i]=al[start][i];
    23     for(int i=1;i<=n;i++){//轮数 
    24         //枚举边
    25         for(int j=1;j<=n;j++){
    26             for(int k=1;k<=n;k++){
    27                 if(dis[j]>dis[k]+al[k][j]){
    28                     dis[j]=dis[k]+al[k][j];
    29                 } 
    30             } 
    31         } 
    32     }
    33 }
    34 
    35 int main(){
    36     freopen("shu_in.txt","r",stdin);
    37     readData();
    38     printAL();
    39     bellman(1);
    40     printDIS();
    41     return 0;
    42 } 
    43 
    44 
    45 
    46 
    47 
    48 void printAL(){
    49     for(int i=1;i<=n;i++){
    50         for(int j=1;j<=n;j++){
    51             cout<<setw(10)<<al[i][j]<<" ";
    52         }
    53         cout<<endl;
    54     }
    55     cout<<endl;
    56 }
    57 void printDIS(){
    58     for(int i=1;i<=n;i++){
    59         cout<<setw(10)<<dis[i]<<" ";
    60     }
    61     cout<<endl;
    62 }
    Bellman-Ford

     SPFA:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,m;
     4 int al[15][15];
     5 int dis[15];
     6 queue<int> que;
     7 bool inQue[15];
     8 void printAL();
     9 void printDIS();
    10 void readData(){
    11     memset(al,0x7,sizeof(al));
    12     cin>>n>>m;
    13     for(int i=1;i<=n;i++) al[i][i]=0;
    14     for(int i=1;i<=m;i++){
    15         int a,b,w;
    16         cin>>a>>b>>w;
    17         al[a][b]=w;
    18         al[b][a]=w;
    19     }    
    20     
    21 }
    22 
    23 void spfa(int start){
    24     //dis数组的初始值很大 
    25     for(int i=1;i<=n;i++) dis[i]=0x3fffffff;
    26     dis[start]=0;
    27     que.push(start);
    28     inQue[start]=true;
    29     while(!que.empty()){
    30         int tmp=que.front();
    31         que.pop();
    32         inQue[tmp]=false;
    33         for(int i=1;i<=n;i++){
    34             if(dis[i]>dis[tmp]+al[tmp][i]){
    35                 dis[i]=dis[tmp]+al[tmp][i];
    36                 if(!inQue[i]){
    37                     inQue[i]=true;
    38                     que.push(i);
    39                 }
    40             }        
    41         }            
    42         
    43     } 
    44 }
    45 
    46 int main(){
    47     freopen("shu_in.txt","r",stdin);
    48     readData();
    49     printAL();
    50     spfa(1);
    51     printDIS();
    52     return 0;
    53 } 
    54 
    55 
    56 
    57 
    58 
    59 void printAL(){
    60     for(int i=1;i<=n;i++){
    61         for(int j=1;j<=n;j++){
    62             cout<<setw(10)<<al[i][j]<<" ";
    63         }
    64         cout<<endl;
    65     }
    66     cout<<endl;
    67 }
    68 void printDIS(){
    69     for(int i=1;i<=n;i++){
    70         cout<<setw(10)<<dis[i]<<" ";
    71     }
    72     cout<<endl;
    73 }
    SPFA

    SPFA中dis数组的初始值很大 

  • 相关阅读:
    开发板S3C2440挂起NFS步骤
    wind10系统 Atheros AR9271 Wireless Network Adapter USBwifi无线网卡的驱动安装解决无法搜索wifi信号,连接wifi信号无法上网的问题
    编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。
    led.c驱动框架2nd
    led.c驱动框架
    文件I/O的操作实例
    Python os.removedirs() 和shutil.rmtree() 用于删除文件夹
    Python os.remove() 删除文件
    Python os.chdir() 方法
    Python os.access() 方法
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7468536.html
Copyright © 2011-2022 走看看