暂时写了两种算法flody和dijkstra算法,两种算法我都转载了相关的文章在我的博客中。
感觉还可以写dfs和bfs的算法,以后再更新。
flody
#include<iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
int const maxn = 210;
int map[maxn][maxn];
int main() {
int n,m;
while (cin>>n>>m&&!(n==0&&m==0)) {
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
map[i][j]= i==j?0:INF;
for (int i=0;i<m;i++) {
int a,b,c;
cin>>a>>b>>c;
if (c<map[a][b]) {
map[a][b]=c;
map[b][a]=c;}
}
for (int k=0;k<n;k++)
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if(map[i][k]+map[k][j]<map[i][j]) map[i][j] = map[i][k] + map[k][j];
int a,b;
cin>>a>>b;
cout<<(map[a][b]==INF?-1:map[a][b])<<endl;
}
}
dijkstra
#include<iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
int const maxn = 210;
int map[maxn][maxn];
int dis[maxn];
int vis[maxn];
int main() {
int n,m;
while (cin>>n>>m&&!(n==0&&m==0)) {
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
map[i][j]= i==j?0:INF;
for (int i=0;i<m;i++) {
int a,b,c;
cin>>a>>b>>c;
if (c<map[a][b]) {
map[a][b]=c;
map[b][a]=c;}
}
int s,e;
cin>>s>>e;
for (int i=0;i<n;i++) {
dis[i] = map[s][i];
vis[i]=0;
}
int k,tmp = INF;
int flag = 1;
vis[s] =1;
for (int j=0;j<n;j++) {
tmp = INF;
for (int i=0;i<n;i++)
if (!vis[i]&&tmp>dis[i]) {
k = i;
tmp = dis[i];
}
if (tmp == INF) {flag = 0;break;}
vis[k] = 1;
for (int i=0;i<n;i++) {
if (!vis[i]&&dis[i]>dis[k] +map[k][i])
dis[i] = dis[k] +map[k][i];
}
}
if(dis[e]!=INF) cout<<dis[e]<<endl;
else cout<<-1<<endl;
}}
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 200;
const int INF = 0x3f3f3f3f;
int map[maxn][maxn];
int vis[maxn],dis[maxn];
int nv,ne;
struct edge{
int AdjV;
int distance;
};
int f(int st,int ed) {
for (int i=0;i<nv;i++) {
vis[i]=0;
dis[i] = 0x3f3f3f3f;
}
vis[st] = 1; dis[st]=0;
for(int i=0;i<nv;i++) {
if(map[st][i]!=INF) {
dis[i] = map[st][i];
}
}
for(int i=0;i<nv-1;i++) {
int tmp = 0x3f3f3f3f,k=st;
for (int j=0;j<nv;j++) {
if(!vis[j]&&tmp>dis[j]) {
tmp = dis[j]; k = j;
}
}
vis[k] = 1;
for (int j=0;j<nv&&k!=st;j++) {
if(!vis[j]&&dis[j]>dis[k]+map[k][j]) {
dis[j] = dis[k]+map[k][j];
}
}
}
if(dis[ed]!=INF) return dis[ed];
else return -1;
}
int main() {
while(cin>>nv>>ne&&!(nv==0&&ne==0)) {
for (int i=0;i<nv;i++)
for (int j=0;j<nv;j++) map[i][j]=(i==j?0:INF); //这里也也很重要!
for (int i=0;i<ne;i++) {
int a1,a2,a3;
cin>>a1>>a2>>a3;
if(map[a1][a2]>a3) {
map[a1][a2] = a3;
map[a2][a1] = a3;
}
}
int st,ed;
cin>>st>>ed;
int ans = f(st,ed);
cout<<ans<<endl;
}
}