1.迪杰斯特拉算法
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int times[501][501];
int path[501][501];
int vis1[502];
int vis2[502];
int d1[502];
int d2[502];
int main()
{
int n,m;
int s,e,dp,p,t;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
d1[i]=1000001;
d2[i]=1000001;
}
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
path[i][j]=1000001,times[i][j]=1000001;
for(int i=1;i<=m;i++)
{
cin>>s>>e>>dp>>p>>t;
if(dp)
{
times[s][e]=t;
path[s][e]=p;
}
else
{
times[s][e]=t;
times[e][s]=t;
path[s][e]=t;
path[e][s]=t;
}
}
cin>>start>>end;
vis1[start]=1;
vis2[start]=1;
d1[start]=0;
d2[start]=0;
for(int i=1;i<=n;i++)
{
d1[i] = path[start][i];
d2[i] = times[start][i];
}
for(int i=1;i<=n;i++)
{
int min1=10000001;
int min2=10000001;
for(int j=1;j<=n;j++)
{
if(vis1[j])
continue;
if(d1[j]<min1)
{
min1=d1[j];
mark1=j;
}
}
vis1[mark1]=1;
for(int k=1;k<=n;k++)
{
if(vis2[k])
continue;
if(d2[k]<min2)
{mark2=k;
min2=d2[k];
}
}
vis2[mark2]=1;
for(int v=1;v<=n;v++)
{
if(!vis1[v])
{
if(d1[mark1]+path[mark1][v]==d1[v])
{
if(d2[mark1]+times[mark1][v]<d2[v])
pre1[v]=mark1;
}
else
if(d1[mark1]+path[mark1][v]<d1[v])
d1[v]=d1[mark1]+path[mark1][v];
}
}
}
return 0;
}
2.弗洛伊德算法
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string>
#define inf 100000000;
using namespace std;
int f[105][105];
int a[105][105];
int n,m;
int main()
{
int x,y,z;
int s,e;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=inf;
for(int i=1;i<=n;i++)
f[i][i]=0;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
f[x][y]=z;
f[y][z]=z;
}
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])
f[i][j]=f[i][k]+f[k][j];
cin>>s>>e;
cout<<f[s][e];
return 0;
}