题目地址:​​点击打开链接​

思路:应该定义为double却定义为int,wrong了无数发,注意起点和终点一样的情况

AC代码1:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

using namespace std;

const int maxn = 1010;
double map1[maxn][maxn];
double lowdist[maxn];
int visit[maxn];
int n;

void Dijkstra(int st,int ed)
{
int i,j,k;
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
{
lowdist[i] = map1[st][i];
}
lowdist[st] = 1;//起点和终点一样的情况
visit[st] = 1;
for(i=1; i<n; i++)
{
double max2 = -1;//注意用double,用int wrong了无数发
for(j=1; j<=n; j++)
{
if(!visit[j] && lowdist[j] > max2)
{
k = j;
max2 = lowdist[j];
}
}
visit[k] = 1;
for(j=1; j<=n; j++)
{
if(!visit[j] && lowdist[k] * map1[k][j] > lowdist[j])
{
lowdist[j] = lowdist[k] * map1[k][j];
}
}
}
}

int main()
{
int i,j,q;
while(scanf("%d",&n) != EOF)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%lf",&map1[i][j]);
}
}
scanf("%d",&q);
int st,ed;
for(i=0; i<q; i++)
{
scanf("%d%d",&st,&ed);
Dijkstra(st,ed);
if(lowdist[ed] != 0)
{
printf("%.3lf\n",lowdist[ed]);
}
else
{
printf("What a pity!\n");
}
}
}
return 0;
}

AC代码2:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

using namespace std;

const int maxn = 1010;
double map1[maxn][maxn];
double lowdist[maxn];
int visit[maxn];
int n;

void Dijkstra(int st,int ed)
{
int i,j,k;
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
{
lowdist[i] = map1[st][i];
}
lowdist[st] = 1;
visit[st] = 1;
for(i=1; i<n; i++)
{
double max2 = 0;
k = 0;
for(j=1; j<=n; j++)
{
if(!visit[j] && lowdist[j] > max2)
{
k = j;
max2 = lowdist[j];
}
}
if(k == 0)//当k为0,表示剩下的路都不能走了,退出来
return;
visit[k] = 1;
for(j=1; j<=n; j++)
{
if(!visit[j] && lowdist[k] * map1[k][j] > lowdist[j])
{
lowdist[j] = lowdist[k] * map1[k][j];
}
}
}
}

int main()
{
int i,j,q;
while(scanf("%d",&n) != EOF)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%lf",&map1[i][j]);
}
}
scanf("%d",&q);
int st,ed;
for(i=0; i<q; i++)
{
scanf("%d%d",&st,&ed);
Dijkstra(st,ed);
if(lowdist[ed] != 0)
{
printf("%.3lf\n",lowdist[ed]);
}
else
{
printf("What a pity!\n");
}
}
}
return 0;
}