\(dist[s][t]=min(dist[s][t],dist[s][k]+dist[k][t])\)
\(O(n^3)\)
#include<bits/stdc++.h> #define ll long long using namespace std; int mp[1005][1005]; void floyd_wharshall(int n){ for(int k=0;k<n;++k) for(int i=0;i<n;++i) for(int j=0;j<n;++j) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); } int main(){ memset(mp,0x3f,sizeof(mp)); int n,m;cin>>n>>m; for(int i=0;i<m;++i){ int a,b,w; cin>>a>>b>>w; mp[a][b]=w;mp[b][a]=w; } for(int i=0;i<n;++i)mp[i][i]=0; floyd_wharshall(n); return 0; }
\(O(n^2)\)
struct data{ int a,b,w; }edge[100005]; ll dist[100005]; void bellman_ford(int n,int m){ memset(dist,0x3f,sizeof(dist)); for(int i=0;i<n;++i){ bool valid=0; for(int j=0;j<m ;++j){ if(dist[edge[j].a]>dist[edge[j].b]+edge[j].w){ dist[edge[j].a]=dist[edge[j].b]+edge[j].w; valid=1; } if(dist[edge[j].b]>dist[edge[j].a]+edge[j].w){ dist[edge[j].b]=dist[edge[j].a]+edge[j].w; valid=1; } } if(!valid)return; if(i==n-1){ cout<<"negative\n"; return; } } }
#include<bits/stdc++.h> #define ll long long using namespace std; struct data{ int a,b,w; }edge[100005]; ll dist[100005]; void bellman_ford(int n,int m){ memset(dist,0x3f,sizeof(dist)); for(int i=0;i<n;++i){ bool valid=0; for(int j=0;j<m ;++j){ if(dist[edge[j].a]>dist[edge[j].b]+edge[j].w){ dist[edge[j].a]=dist[edge[j].b]+edge[j].w; valid=1; } if(dist[edge[j].b]>dist[edge[j].a]+edge[j].w){ dist[edge[j].b]=dist[edge[j].a]+edge[j].w; valid=1; } } if(!valid)return; if(i==n-1){ cout<<"negative\n"; return; } } } int main(){ int n,m;cin>>n>>m; for(int i=0;i<m;++i){ cin>>edge[i].a>>edge[i].b>>edge[i].w; } bellman_ford(n,m); return 0; }
\(O(n^2)\)
#define ll long long #define ff first #define ss second #define mp make_pair vector<pair<int,ll>> v[100005]; ll dist[100005]; void dijkstra(int u){ memset(dist,0x3f,sizeof(dist)); priority_queue<pair<ll,int> > pq; pq.emplace(0,u); while(!pq.empty()){ auto tmp=pq.top();pq.pop(); if(dist[tmp.ss]!=0x3f3f3f3f3f3f3f3f)continue; dist[tmp.ss]=-tmp.ff; for(auto e:v[tmp.ss]) pq.emplace(-(e.ss-tmp.ff),e.ff); } }
#include<bits/stdc++.h> #define ll long long #define ff first #define ss second #define mp make_pair using namespace std; vector<pair<int,ll>> v[100005];//存圖 ll dist[100005];//存原點到各點的最短路 void dijkstra(int u){ memset(dist,0x3f,sizeof(dist));//初始化 priority_queue<pair<ll,int> > pq; pq.emplace(0,u); while(!pq.empty()){//重複執行直到所有點都走過 auto tmp=pq.top();pq.pop(); if(dist[tmp.ss]!=0x3f3f3f3f3f3f3f3f)continue; dist[tmp.ss]=-tmp.ff; for(auto e:v[tmp.ss]) pq.emplace(-(e.ss-tmp.ff),e.ff); } } int main(){ int n,m;cin>>n>>m; for(int i=0;i<m;++i){ int a,b,w; cin>>a>>b>>w; v[a].emplace_back(mp(b,w)); v[b].emplace_back(mp(a,w)); } int s,t;//尋找s~t的最短路 cin>>s>>t; dijkstra(s); cout<<dist[t]<<'\n'; return 0; }