用佛洛依德,迪杰斯特拉都可以做。
最安全的就是最大路,将转移方程改为,dis【i】=MAX(dis[u]*map[u][i],dis[i]);即可;
代码:
迪杰斯特拉
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
double dis[1001];
double map[1001][1001];
bool vis[1001];
int n;
void SPFA(int x,int y)
{ memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
dis[i]=map[x][i];
vis[x]=1;
for(int i=1;i<n;i++)
{
int u;
double maxx=-1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&maxx<dis[i])
{
maxx=dis[i];
u=i;
}
}
vis[u]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[u]*map[u][j]>dis[j])
{
dis[j]=dis[u]*map[u][j];
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%lf",&map[i][j]);
}
}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
SPFA(x, y);
if(dis[y]!=0)
printf("%.3lf\n",dis[y]);
else
printf("What a pity!\n");
}
}
}
佛洛依德
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
double dis[1001][1001];
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%lf",&dis[i][j]);
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][k]*dis[k][j]>dis[i][j])
{
dis[i][j]=dis[i][k]*dis[k][j];
}
}
}
}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
if(dis[x][y]!=0) printf("%.3lf\n",dis[x][y]);
else printf("What a pity!\n");
}
}
}