1381:城市路(Dijkstra)

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

邻接表代码(Bellman_Ford):

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 
 5 int n,m;
 6 bool vis[2005];//访问标记 
 7 int dis[2005];//最短距离
 8 struct node{
 9     int v;
10     int d;
11 };
12 vector<node> adj[2005];//图(邻接表) 
13 
14 void Bellman_Ford(int s){//核心代码
15 //  for(int i=0;i<n;i++){
16 //    dis[i]=INF;
17 //    }
18     memset(dis,0x3f,sizeof(dis));
19     dis[s]=0;
20     for(int i=0;i<n-1;i++){
21         bool check=0;
22         for(int j=1;j<=n;j++){
23             for(int k=0;k<adj[j].size();k++){
24                 int v=adj[j][k].v;
25                 int d1=adj[j][k].d;
26                 if(dis[v]>dis[j]+d1){
27                     dis[v]=dis[j]+d1;
28                     check=1;
29                 }
30             }
31         }
32         if(check==0) break;
33     }
34 }
35                                                                                                                                                  
36 int main(){
37     cin>>n>>m;
38 //    scanf("%d%d", &n, &m);
39     for(int i=1;i<=m;i++){
40         int a,b;
41         int c;
42         cin>>a>>b>>c;
43 //        scanf("%d%d%d",&a,&b,&c);
44         node temp;
45         temp.v=b;
46         temp.d=c;
47         adj[a].push_back(temp);
48         temp.v=a;
49         temp.d=c;
50         adj[b].push_back(temp);
51     } 
52 //    for(int i=1;i<=n;i++){
53 //        cout<<i<<':';
54 //        for(int j=0;j<adj[i].size();j++){
55 //            cout<<adj[i][j].v<<'('<<adj[i][j].d<<')'<<" ";
56 //        }
57 //        cout<<endl;
58 //    }
59     Bellman_Ford(1);
60     cout<<dis[n];
61 //    printf("%d",dis[n]);
62     return 0;
63 }

邻接表代码(Dijkstra):

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 
 5 int n,m;
 6 bool vis[2005];//访问标记 
 7 int dis[2005];//最短距离
 8 
 9 struct node{
10     int v,d;
11 };
12 vector<node> adj[2005];//图(邻接表) 
13 
14 void Dijkstra(int s){//核心代码
15     for(int i=1;i<=n;i++){
16         dis[i]=INF;
17     }
18     dis[s]=0;
19     for(int i=1;i<=n;i++){
20         int u=-1,MIN=INF;
21         for(int j=1;j<=n;j++){
22             if(vis[j]==0 && dis[j]<MIN){
23                 u=j;
24                 MIN=dis[j];
25             }
26         }
27         if(u==-1) return;
28         vis[u]=1;
29         for(int j=0;j<adj[u].size();j++){
30             int v=adj[u][j].v;
31             if(vis[v]==0 && dis[u]+adj[u][j].d<dis[v]){
32                 dis[v]=dis[u]+adj[u][j].d;
33             }
34         }
35     }
36 }
37 
38 int main(){
39     cin>>n>>m;
40     for(int i=1;i<=m;i++){
41         int a,b,c;
42         cin>>a>>b>>c;
43         node temp;
44         temp.v=b;
45         temp.d=c;
46         adj[a].push_back(temp);
47         temp.v=a;
48         temp.d=c;
49         adj[b].push_back(temp);
50     } 
51 //    for(int i=1;i<=n;i++){
52 //        cout<<i<<':';
53 //        for(int j=0;j<adj[i].size();j++){
54 //            cout<<adj[i][j].v<<'('<<adj[i][j].d<<')'<<" ";
55 //        }
56 //        cout<<endl;
57 //    }
58     Dijkstra(1);
59     if(dis[n]==INF) cout<<-1;
60     else cout<<dis[n];
61     return 0;
62 }

邻接矩阵代码(Dijkstra):

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

 

posted @ 2021-04-10 11:35  Wag_Ho  阅读(188)  评论(0编辑  收藏  举报