最短路--DijkstraFloyedSPFA
生活随笔
收集整理的這篇文章主要介紹了
最短路--DijkstraFloyedSPFA
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最短路徑是一個很常見的問題,這里有3種方法,可供參考。
一.Dijkstra#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int a[101][3]; double c[101]; bool b[101]; double f[101][101]; int n,i,j,k,x,y,m,s,e; double minl; double maxx = 1e30; int main() {cin >> n;for (i = 1; i <= n; i++)cin >> a[i][1] >> a[i][2];for (i = 1; i <= n; i++)for(j = 1; j <= n; j++)f[i][j] = maxx;cin >> m;for (i = 1; i <= m; i++){cin >> x >> y;f[x][y] = f[y][x] = sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));}cin>>s>>e;for(int i = 1;i <= n;i++){c[i] = f[s][i];}memset(b,false,sizeof(b));b[s] = true;c[s] = 0;for(int i = 1;i <= n;i++){minl = maxx;k = 0;for(int j = 1;j <= n;j++){if(b[j] == false && c[j] < minl)//沒走過的路程最小的點{minl = c[j];k = j;}}if(k == 0)break;b[k] = true;for(int j = 1;j <= n;j++) //將所以能變的點最小路程全變了{if(c[k] + f[k][j] < c[j])c[j] = c[k] + f[k][j];}}printf("%.2lf",c[e]);return 0; } 二.Floyed
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; double f[100][100]; int a[100][3]; int m,n,x,y,r,s,e; int main() {memset(f,127,sizeof(f));cin>>n;for(int i = 1;i <= n;i++){cin>>a[i][1]>>a[i][2];}cin>>m;for(int i = 1;i <= m;i++){cin>>x>>y;f[y][x] = f[x][y] = sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));}cin>>s>>e;for(int k = 1;k <= n;k++){for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){if(f[i][j] > f[i][k] + f[k][j] && i != j && i != k && j != k)f[i][j] = f[i][k] + f[k][j];}}}printf("%.2lf",f[s][e]);return 0; } /* 5 0 0 2 0 2 2 0 2 3 1 5 1 2 1 3 1 4 2 5 3 5 1 5 */ 三.SPFA #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int n,p,c,i,j,x,y,t,min1,head,tail,tot,u; int a[801][801],b[501],dis[801],num[801],w[801][801]; queue <int> team; bool exist[801]; int main() {cin>>n>>p>>c;for(i=1;i<=p;i++){b[i]=0;num[i]=0;for(j=1;j<=p;j++)w[i][j]=0x7fffffff/3;}for(i = 1;i <= n;i++)cin>>b[i];for(i=1;i<=c;i++) //鄰接矩陣存儲 {cin>>x>>y>>t;w[x][y] = t;a[x][++num[x]] = y;a[y][++num[y]] = x;w[y][x] = w[x][y];}min1=0x7fffffff/3;for(i=1;i<=p;i++){for(j=1;j<=p;j++) dis[j]=0x7fffffff/3; //隊列數(shù)組初始化memset(exist,false,sizeof(exist)); //exist標(biāo)志初始化dis[i]=0;exist[i]=true;team.push(i);while(!team.empty()){u = team.front();team.pop();exist[u] = true;for(int j = 1;j <= num[u];j++){if(dis[a[u][j]] > dis[u] + w[u][a[u][j]]){dis[a[u][j]] = dis[u] + w[u][a[u][j]];if(!exist[a[u][j]]){team.push(a[u][j]);a[u][j] = true;}}}}tot=0;for(j=1;j<=n;j++)tot+=dis[b[j]];if (tot<min1) min1=tot;}cout<<min1;return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/DukeLv/p/8366644.html
總結(jié)
以上是生活随笔為你收集整理的最短路--DijkstraFloyedSPFA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 1968: [Ahoi2005
- 下一篇: 读小米的《参与感》书的摘录(一),与大家