1、Dijkstra 🍓html
單源,O(n^2)ios
思路就是找到一個點,先放它全部的位置c++
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 }
2、Floyd 🍎ide
多源,O(n^3)spa
//不能解決負權問題,負權圖沒有最短路.net
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 }