最近开始研究最短路。
一开始很迷惑,因为有好多种方法,最短路算法众多有floyd、dij、bell-man、spfa,速度最快就是dij+优先队列或者dij+堆排序,spfa理论上很快o(ke)但实际并不一定不过spfa传说中有一个很NB用处就是处理带负权回路。
现在,无意中学会了Floyd和dij的用法,而且可以过了两道题,可以说用的还可以了吧。。。
附上代码:(dij)
#include<stdio.h>
#include<string.h>
double map[1002][1002];
int vis[1002];
double divs[1002];
int n,m;
int a,b;
double zdl()
{
for(int i=1; i<=n; i++)
divs[i]=map[a][i];
vis[a]=1;
divs[a]=0;
for(int i=1; i<=n; i++)
{
double min=0;
int d=a;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&min<divs[j])
{
min=divs[j];
d=j;
}
}
vis[d]=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&divs[j]<divs[d]*map[d][j])
divs[j]=divs[d]*map[d][j];
}
return divs[b];
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%lf",&map[i][j]);
scanf("%d",&m);
for(int i=0; i<m; i++)
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&a,&b);
double res=zdl();
if(res)
printf("%.3lf\n",res);
else
printf("What a pity!\n");
}
}
return 0;
}
这个是网上的,也理解了,floyd的:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define maxn 1001
double matrix[maxn][maxn];
int n,m;
void floyd()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(matrix[j][k]<matrix[j][i]*matrix[i][k])
matrix[j][k]=matrix[j][i]*matrix[i][k];
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lf",&matrix[i][j]);
floyd();
scanf("%d",&m);
while(m--)
{
int start,end;
scanf("%d%d",&start,&end);
if(matrix[start][end])
printf("%.3lf\n",matrix[start][end]);
else printf("What a pity!\n");
}
}
return 0;
}
接下来要向spfa进攻。。。