您的位置:首页 > 其它

多校联合比赛部分题目

2012-07-27 21:42 239 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4308

题意:王子找公主。在一个图里面,如果是 * 则表示可以走,而且没走一个 * 需要的话费是 c 元,如果是 # 则不能通过,如果是 P 则可以跳到其他任意一个 P 所在的点,王子是 Y 表示,公主是 C 表示,问王子找到公主的最小花费。

思路:bfs,跟普通的bfs一样,但是由于题目里面说 P 与 P 是可以任意到达的(而且不需要任何花费),所以要特殊处理,用一个队保存可行点,从当前点开始搜索,如果遇到 * 则进队继续搜索,如果遇到 P 则要把图里面所有的 P 都搜出来进队,然后继续搜索。因为题目说 r * c <= 5000 ,怕超内存,这里我把二维的数组改成了一维的,下标进行了转换。不过貌似看网上有人也用的二维的

View Code

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdlib.h>
#define N 50010
#define inf 1000000
#define _clr(a,val) (memset(a,val,sizeof(a)))

using namespace std;

struct node
{
int from;
int to;
double wei;
int next;
}eage[N * 50];
bool v
;
int head
;
double dis
;
int s,e,val;
int num,n,m;
void add(int f,int t,double w)
{
eage[num].from = f;
eage[num].to = t;
eage[num].wei = w;
eage[num].next = head[f];
head[f] = num++;
}
void spfa()
{
queue<int>qu;
for(int i = 1; i <= n; i++)
{
v[i] = false;
dis[i] = inf;
}
v[s] = true, dis[s] = 0;
qu.push(s);
while(!qu.empty())
{
int tem = qu.front();
qu.pop();
v[tem] = false;
for(int i = head[tem]; i != -1; i = eage[i].next)
{
int tt = eage[i].to;
double temp = dis[tem] + eage[i].wei;
if(dis[tt] > temp)
{
dis[tt] = temp;
if(!v[tt])
{
v[tt] = true;
qu.push(tt);
}
}
}
}
}
int main()
{
int i;
int f,t;
int k;
//freopen("data.txt","r",stdin);
while(scanf("%d",&n) != EOF)
{
num = 0;
_clr(head,-1);
for(i = 1; i <= n; i++)
{
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&f,&t);
add(i,f, -log((1.0 - (double)(t) / 100.0)));
}
}
scanf("%d%d%d",&s,&e,&val);
spfa();
if(dis[e] == inf) printf("IMPOSSIBLE\n");
else printf("%.2lf\n",val * (1.0 - exp(-dis[e])));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: