此题最短路稍微变形,求乘积最长路,即乘积最大的那条路,题给出了5000MS时间限制,SPFA、FLOYD和Dijkstra暴力都可解。
顶点1000个,最多开一个n*n, 2个n的数组,SPFA中如果用数组q[n]来维护队列的话就会出错。
SPFA:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
using namespace std;
double map[1001][1001],dis[1001];
int visit[1001];
int vex,arc;
void Spfa(int s)
{
int i,pos;
for(i=0;i<=vex;i++)
{
visit[i]=0;
dis[i]=0;
}
queue<int>q;
q.push(s);
visit[s]=1;
dis[s]=1.0;
while(!q.empty())
{
pos=q.front();
q.pop();
visit[pos]=0;
for(i=1;i<=vex;i++)
{
if(i==pos) continue;
if(dis[i]<dis[pos]*map[pos][i])
{
dis[i]=dis[pos]*map[pos][i];
if(!visit[i])
{
q.push(i);
visit[i]=1;
}
}
}
}
}
int main()
{
int i,j,a,b;
while(scanf("%d",&vex)!=EOF)
{
memset(map,0,sizeof(map));
for(i=1;i<=vex;i++)
{
for(j=1;j<=vex;j++)
{
scanf("%lf",&map[i][j]);
}
}
scanf("%d",&arc);//输入要求的边
for(i=1;i<=arc;i++)
{
scanf("%d%d",&a,&b);
Spfa(a);
if(dis[b]!=0.0) printf("%.3lf\n",dis[b]);
else printf("What a pity!\n");
}
}
return 0;
}
FLOYD:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
double map[1001][1001];
int vex,arc;
void Floyd()
{
int i,j,k;
for(k=1;k<=vex;k++)
{
for(i=1;i<=vex;i++)
{
for(j=1;j<=vex;j++)
{
if(map[i][j]<map[i][k]*map[k][j]) map[i][j]=map[i][k]*map[k][j];
}
}
}
}
int main()
{
int i,j,a,b;
while(scanf("%d",&vex)!=EOF)
{
memset(map,0,sizeof(map));
for(i=1;i<=vex;i++)
{
for(j=1;j<=vex;j++)
{
scanf("%lf",&map[i][j]);
}
}//输入矩阵
Floyd();
scanf("%d",&arc);//输入要求的边
for(i=1;i<=arc;i++)
{
scanf("%d%d",&a,&b);
if(map[a][b]!=0.0) printf("%.3lf\n",map[a][b]);
else printf("What a pity!\n");
}
}
return 0;
}
Dijkstra:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
using namespace std;
double map[1001][1001],dis[1001];
int visit[1001];
int vex,arc;
void Dijkstra(int s)
{
int i,j,pos;
double max;
for(i=1;i<=vex;i++)
{
visit[i]=0;
dis[i]=map[s][i];
}
visit[s]=1;
dis[s]=1.0;
for(i=1;i<=vex-1;i++)
{
max=0.0;
for(j=1;j<=vex;j++)
{
if(!visit[j] && dis[j]>max)
{
max=dis[j];
pos=j;
}
}
visit[pos]=1;
for(j=1;j<=vex;j++)
{
if(!visit[j] && dis[j]<dis[pos]*map[pos][j])
{
dis[j]=dis[pos]*map[pos][j];
}
}
}
}
int main()
{
int i,j,a,b;
while(scanf("%d",&vex)!=EOF)
{
memset(map,0,sizeof(map));
for(i=1;i<=vex;i++)
{
for(j=1;j<=vex;j++)
{
scanf("%lf",&map[i][j]);
}
}
scanf("%d",&arc);//输入要求的边
for(i=1;i<=arc;i++)
{
scanf("%d%d",&a,&b);
Dijkstra(a);
if(dis[b]!=0.0) printf("%.3lf\n",dis[b]);
else printf("What a pity!\n");
}
}
return 0;
}