#include <cstdio>
#include <vector>
#include <queue>
const int N_MAX=35, M_MAX=1020;
struct state {
int time, node;
double ratio;
bool operator < (const state &t) const {
return time*ratio > t.time*t.ratio;
}
};
struct edge {
int to, time;
};
int n, m, outCount[N_MAX];
std::vector < edge > to[N_MAX];
void input(){
scanf("%d%d", &n, &m);
int i;
for(i=0; i<m; i++){
int p, q, r;
scanf("%d%d%d", &p, &q, &r);
edge t;
t.time = r;
t.to = q;
to[p].push_back(t);
}
}
std::priority_queue < state > pq;
double res;
void solve(){
state now;
now.node = 0;
now.ratio = 1;
now.time = 0;
pq.push(now);
while(true){
now = pq.top();
pq.pop();
if(now.time > 0 && now.time*now.ratio < 1e-8)
break;
int i, size=to[now.node].size();
for(i=0; i<size; i++){
int next = to[now.node][i].to;
int edgeTime = to[now.node][i].time;
state sNext;
sNext.node = next;
sNext.ratio = now.ratio/size;
sNext.time = now.time+edgeTime;
if(next == n)
res += sNext.ratio*sNext.time;
else
pq.push(sNext);
}
}
printf("%.10lf\n", res);
}
int main(){
input();
solve();
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
1212 KB |
Output is correct |
2 |
Incorrect |
0 ms |
1212 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |