ACDream - Chasing Girl

先上题目:

Chasing Girl

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

SubmitStatus

Problem Description

YYS 是SCAU_ACM里相当有名气的高富帅, 又因为他曾代表SCAU参加 World Final 而被各路亲朋好友仰慕。但YYS 又有另外一个嗜好,就是泡妞。在大学的时候,他经常去找各个女友玩耍, 但在路上却又整天遇到膜拜他的渣渣,这令他非常烦恼。于是, 他每次去找女友都希望尽量避开膜拜他的渣渣。
       YYS 把校园抽象成n个点, m条双向路组成的图。由多次经验他统计出在某条路上遇到渣渣的概率, 他现在要从A走到B, 由于他急于跟女友xxx, 所以想选择一条长度最短,在此基础上遇到渣渣概率最小的路径。YYS此时的心思只有女友, 他想你帮他算一下, 最短的路径长度和最小的概率是多少。

Input

第一行一个整数T,代表测试数据的组数。
对每组数据, 
第一行, 两个整数n, m
接下来m行,每行4个整数 u, v, w, p, 代表u,v之间有一条长度为w双向路,在这条路遇到渣渣的概率为p%
最后一行, 两个整数A, B

数据范围:
1 <= T <= 100
1 <= n <= 1000
1 <= m <= 10000
1 <= u, v, A, B <= n
1 <= w <= 100
0 <= p < 100

数据保证无重边、无自环,并且A、B之间至少有一条路径。

Output

对每组数据,输出最短的路径长度和最小的概率(保留6位小数)。

Sample Input

2
4 4
1 2 1 50
2 3 2 50
1 4 5 20
4 3 3 30
2 4

4 4
1 2 1 50
2 3 2 50
1 4 4 20
4 3 3 30
2 4

Sample Output

5 0.650000
5 0.600000

  比较简单的最短路,求一次最短路,同时算一下一路上不会遇到那些人的概率,如果遇到将要修改的距离等于已经得到的最短距离的话,就根据概率来判断,如果概率变大了就更新为新的概率。  输出的时候概率用1减一次就得到结果了(1-反面的概率)。  这里的图是有环的,看自己的笔记好像是说DIJ只可以求DAG,所用用了SPFA,但是小伙伴说用DIJ也过了······

上代码:

 1 /*
 2 * this code is made by sineatos
 3 * Problem: 1180
 4 * Verdict: Accepted
 5 * Submission Date: 2014-07-31 15:23:49
 6 * Time: 228MS
 7 * Memory: 1884KB
 8 */
 9 #include <cstdio>
10 #include <cstring>
11 #include <algorithm>
12 #include <queue>
13 #include <vector>
14 #define MAX 10002
15 #define INF (1<<30)
16 #define ll long long
17 using namespace std;
18
19 int n,m,st,ed;
20
21 typedef struct{
22     int to,next,l;
23     double p;
24 }edge;
25
26 edge e[MAX<<1];
27 int p[MAX],tot;
28 int dist[MAX];
29 double pa[MAX];
30 queue<int> q;
31 bool vis[MAX];
32
33 inline void add(int u,int v,int l,int per){
34     e[tot].to=v; e[tot].l=l; e[tot].p=1-(per*1.0/100); e[tot].next=p[u]; p[u]=tot++;
35 }
36
37 void spfa(){
38     for(int i=1;i<=n;i++) dist[i]=INF;
39     memset(vis,0,sizeof(vis));
40     while(!q.empty()) q.pop();
41     dist[st]=0;
42     pa[st]=1;
43     vis[st]=1;
44     q.push(st);
45     while(!q.empty()){
46         int u = q.front();
47         q.pop();
48         vis[u]=0;
49         for(int i=p[u];i!=-1;i=e[i].next){
50             if(e[i].l+dist[u]<dist[e[i].to]){
51                 dist[e[i].to]=e[i].l+dist[u];
52                 pa[e[i].to]=pa[u]*e[i].p;
53                 if(!vis[e[i].to]){
54                     vis[e[i].to]=1;
55                     q.push(e[i].to);
56                 }
57             }else if(e[i].l+dist[u]==dist[e[i].to] && pa[e[i].to]<pa[u]*e[i].p){
58                 pa[e[i].to]=pa[u]*e[i].p;
59                 if(!vis[e[i].to]){
60                     vis[e[i].to]=1;
61                     q.push(e[i].to);
62                 }
63             }
64         }
65     }
66 }
67
68 int main()
69 {
70     int t,u,v,l,per;
71     //freopen("data.txt","r",stdin);
72     scanf("%d",&t);
73     while(t--){
74         scanf("%d %d",&n,&m);
75         memset(p,-1,sizeof(p));
76         tot=0;
77         for(int i=0;i<m;i++){
78             scanf("%d %d %d %d",&u,&v,&l,&per);
79             add(u,v,l,per);
80             add(v,u,l,per);
81         }
82         scanf("%d %d",&st,&ed);
83         spfa();
84         printf("%d %.6lf\n",dist[ed],1-pa[ed]);
85     }
86     return 0;
87 }

/*Chasing Girl*/

ACDream - Chasing Girl,布布扣,bubuko.com

时间: 2024-10-10 07:11:46

ACDream - Chasing Girl的相关文章

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N

acdream 1738 世风日下的哗啦啦族I

原题链接:http://acdream.info/problem?pid=1738 树套树裸题,如下: 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #define lc root<<1 7 #define rc root<<1|1 8 using std::so

数学 ACdream 1196 KIDx&#39;s Triangle

题目传送门 1 /* 2 这道题花了好长时间AC,思路有,但是表达式少写了括号一直乱码,囧! 3 注意:a==0时要特判:) 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <iostream> 8 #include <cstring> 9 #include <string> 10 #include <cmath> 11 using namespace std; 1

ACdream 之ACfun 题解

A - ACfun Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus Problem Description 题目链接点击打开链接 As a former ACMer, "AC" is a special abbreviated word which can bring much pleasure to me. Sometimes it means

Ubuntu下快速搭建ACdream Online Judge v1.5.3

原文:https://github.com/KIDx/ACdream#%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96%E6%A8%A1%E5%9D%97 安装依赖 $ sudo apt-get update $ sudo apt-get install imagemagick $ sudo apt-get install python-software-properties python g++ make $ sudo apt-get install libcairo2

ACdream 1157 Segments(CDQ分治)

题目链接:http://acdream.info/problem?pid=1157 Problem Description 由3钟类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i (1-base) 删除第i条增加的线段,保证每条插入线段最多插入一次,且这次删除操作一定合法3) Q L R(1 <= L <= R <= 1000000000) 查询目前存在的线段中有多少条线段完全包含[L,R]这个线段,线段X

ACDream - Graphs

先上题目: Graphs Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus Problem Description 给出N个点,M条边,问是否存在一个连通子图,子图由原图删掉一些点和边(不删亦可),且叶子数>=4(即度为1的点) Input 多组数据,每组数据N,M(0 <= N <= 10000,0 <= M <= 20000) 接下来M

ACDream - Crayon

题目: Description There are only one case in each input file, the first line is a integer N (N ≤ 1,000,00) denoted the total operations executed by Mary. Then following N lines, each line is one of the folling operations. D L R : draw a segment [L, R],

ACdream 1099 瑶瑶的第K大

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩.可是你们都不知道玩什么...尴尬了一阵子,机智的瑶瑶就提议:"这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字."