码迷,mamicode.com
首页 > 其他好文 > 详细

最短路(临街矩阵)

时间:2017-09-03 01:11:01      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:pac   closed   ges   man   ems   set   输入数据   es2017   space   

最短路(临街矩阵)

求最短路:

技术分享

输入数据:

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

 

最短路(临街矩阵)

标签:pac   closed   ges   man   ems   set   输入数据   es2017   space   

原文地址:http://www.cnblogs.com/Renyi-Fan/p/7468536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!