hdu 1596 find the safest road(priority_queue )

/*
 这个题目稀里糊涂地就过了,是zhc说那种方法可以过,结果真的AC
 但是想想感觉是可以的,每次去最大的进行更新,有点像Dijsk的,只是Dijsk 是每次去最小进行更新
 可能是由于是小于1的小数吧
 可是课件上的提示感觉就是用不起来的
 用Floyd 超时了。。。
*/
#include <iostream>//2568534 2010-07-03 23:55:15 Accepted 1596 984MS 6880K 1356 B C++ 悔惜晟
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int N = 1005;
double dis[N];
double cost[N][N];
bool hash[N];
struct node
{
 int num;
 double dis;
 friend bool operator < (node a, node b)
 {
  return a.dis < b.dis;
 }
};

double  BFS(int start ,int end, int n)
{

 priority_queue<node>Q;
 node P, M;
 memset(hash, false, sizeof(hash));
 for(int i= 1; i <= n; i++)
 {
  dis[i] = cost[start][i];
  if(i != start)
  {
   M.num = i;
   M.dis = dis[i];
   Q.push(M);
  }
 }
 hash[start] = true;
 while(!Q.empty())
 {
  P = Q.top();
  Q.pop();
  
  
  if(hash[end])
  {
   //return P.dis;
   break;
  }
  
  hash[P.num] = true;
  for(int i = 1; i <= n; i++)
  {
   if(!hash[i] && P.dis * cost[P.num][i] > dis[i])
   {
    dis[i] = P.dis * cost[P.num][i];
    M.dis = dis[i];
    M.num = i;
    Q.push(M);
   }
  }
 }
 if(dis[end] == 0)
  return 0;
 else
  return dis[end];
}
int main()
{
 int n;
 while(scanf("%d", &n) != EOF)
 {
  for(int i = 1; i <= n; i++)
  for(int j = 1; j <= n; j++)
   scanf("%lf", &cost[i][j]);
  int q;
  scanf("%d", &q);
  int a, b;
  while(q--)
  {
   scanf("%d %d", &a, &b);
   double t = BFS(a, b, n);
   if(t == 0)
    printf("What a pity!/n");
   else
    printf("%0.3lf/n", t);

  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值