shortest path

一、Dijkstra 🍓

单源,O(n^2)

思路就是找到一个点,先放它所有的位置

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stack>
 4 #include<algorithm>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<cstring>
 8 #define mem(a) memset(a,0,sizeof(a))
 9 #define memm(a) memset(a,inf,sizeof(a))
10 #define ll long long
11 #define ld long double
12 #define uL unsigned long long
13 #define pb push_back
14 #define inf 0x3f3f3f3f
15 using namespace std;
16 const int N=1e5+5;
17 const int M=100+5;
18 int n,m,k,x[N],y[N],z[N];
19 int cnt,sum,mx;
20 vector<int>ve[N],v[N];
21 int mp[1005][1005],vis[1005],dis[1005];
22 
23 void init()
24 {
25     memm(mp);
26     for(int i=1;i<=n;i++)
27         mp[i][i]=0;
28 }
29 void getmap()
30 {
31     int u,v,w;
32     for(int i=1;i<=m;i++)
33     {
34         cin>>u>>v>>w;
35         if(mp[u][v]>w)
36             mp[u][v]=mp[v][u]=w;
37     }
38 }
39 void dijkstra(int u)
40 {
41     mem(vis);
42     for(int i=1;i<=n;i++)
43         dis[i]=mp[u][i];
44     vis[u]=1;
45     for(int i=1;i<n;i++)
46     {
47         int mn=inf,temp;
48         for(int j=1;j<=n;j++)
49             if(!vis[j]&&dis[j]<mn)
50                 mn=dis[j],temp=i; //找到相连点中距离最短的
51         vis[temp]=1;
52         for(int j=1;j<=n;j++)
53             if(mp[temp][j]+dis[temp]<dis[j])
54                 dis[j]=mp[temp][j]+dis[temp];
55     }
56 }
57 int main()
58 {
59     cin>>n>>m; //点,边
60     init();
61     getmap();
62     dijkstra(n);
63     return 0;
64 }
(。・∀・)ノ

 二、Floyd 🍎

多源,O(n^3)

//不能解决负权问题,负权图没有最短路

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stack>
 4 #include<algorithm>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<cstring>
 8 #define mem(a) memset(a,0,sizeof(a))
 9 #define memm(a) memset(a,inf,sizeof(a))
10 #define ll long long
11 #define ld long double
12 #define uL unsigned long long
13 #define pb push_back
14 #define inf 0x3f3f3f3f
15 using namespace std;
16 const int N=1e5+5;
17 const int M=100+5;
18 int n,m,k,x[N],y[N],z[N];
19 int cnt,sum,mx;
20 vector<int>ve[N],v[N];
21 int mp[1005][1005],vis[1005],dis[1005];
22 void init()
23 {
24     memm(mp);
25     for(int i=1;i<=n;i++)
26        mp[i][i]=0;
27 }
28 void getmap()
29 {
30     int u,v,w;
31     for(int i=1;i<=m;i++)
32     {
33         cin>>u>>v>>w;
34         mp[u][v]=w;
35     }
36 }
37 void floyd()
38 {
39     for(int k=1;k<=n;k++)
40         for(int i=1;i<=n;i++)
41             for(int j=1;j<=n;j++)
42                 if(mp[i][j]>mp[i][k]+mp[k][j])
43                     mp[i][j]=mp[i][k]+mp[k][j];
44 }
45 int main()
46 {
47     cin>>n>>m; //点,边
48     init();
49     getmap();
50     floyd();
51     return 0;
52 }
(#`O′)

 

posted @ 2019-07-30 19:47  XXrl  阅读(181)  评论(0编辑  收藏  举报