地址: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 }