最短路(临街矩阵)

最短路(临街矩阵)

求最短路:

最短路(临街矩阵)

输入数据:

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数组的初始值很大
原文链接: https://www.cnblogs.com/Renyi-Fan/p/7468536.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/259133

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午12:30
下一篇 2023年2月14日 下午12:31

相关推荐