MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

hdu 1596

Posted on 2011-04-21 18:33  MDeath-Kid  阅读(537)  评论(0编辑  收藏  举报
/*ACMer:MDK
2011-04-21 18:28:14 Accepted 1596 1703MS 8136K 1393 B G++ MDK
*/#include<iostream>
#include
<string.h>
#include
<stdio.h>
#include
<vector>
#include
<limits.h>
#define MAXN 1000
const int INTMAX=0x7f7f7f7f;
const int INTMIN=0x80808080;
using namespace std;

double mat[MAXN][MAXN],minl[MAXN];

void init()
{
memset(mat,
127,sizeof(mat));
memset(minl,
128,sizeof(minl));//这里要初始化最小
}
double dijkstra(int n,int a,int b)
{
int i,j,k;
int v[MAXN]={0};
memset(minl,
128,sizeof(minl));//一开始这里网清零了。。。
for(minl[a]=1,j=0;j<n;j++)
{
for(k=-1,i=0;i<n;i++)
if(!v[i]&&(k==-1||minl[i]>minl[k]))
k
=i;
for(v[k]=1,i=0;i<n;i++)
if(!v[i]&&(mat[k][i]!=INTMIN))
minl[i]
=max(minl[k]*mat[k][i],minl[i]);
}
if(minl[b]<=-1)
return 0;
else
return minl[b];

}
int main()
{
freopen(
"d:\\1.txt","r",stdin);
int N;
while(scanf("%d",&N)!=EOF)
{
init();
for(int i = 0;i<N;i++)
{
for(int j = 0;j<N;j++)
{
scanf(
"%lf",&mat[i][j]);
}
}
int M;scanf("%d",&M);
for(int i =0;i<M;i++)
{
int a,b;
scanf(
"%d%d",&a,&b);
double tmp=dijkstra(N,a-1,b-1);
if(!tmp) printf("What a pity!\n");
else printf("%.3f\n",tmp);
}

}
}

一开始用的Floyd,又是果断超时。。。

打dijkstra代码的时候居然少打一个外循环,我真是蒙了!!什么玩意嘛~下次把清零函数放在dijkstra里面!