问题标题: 酷町堂:1277 最小花费 为什么我WA了样例?大佬求助

0
0
已解决
栾峻岩
栾峻岩
初级天翼
初级天翼

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

const int MAXN = 2010;
const int INF = 10000000;
typedef pair<int, int> P;

struct edge {
    int to, cost;
};

vector<edge> G[MAXN];
priority_queue<P, vector<P>, greater<P> > q;
int d[MAXN], n, m, x, y, z, a, b;

void dijkstra(int s) {
    fill(d + 1, d + n + 1, INF);
    d[s] = 0;
    q.push(P(0, s));
    while (!q.empty()) {
        P p = q.top();
        q.pop();
        int v = p.second;
        if (p.first < d[v])
            continue;
        for (int i = 0; i < G[v].size(); i++) {
            edge e = G[v][i];
            if (d[v] * e.cost > d[e.to]) {
                d[e.to] = d[v] * e.cost;
                q.push(P(d[e.to], e.to));
            }
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> x >> y >> z;
        edge t;
        t.to = y;
        t.cost = 1 - z / 100.0;
        G[x].push_back(t);
        t.to = x;
        G[y].push_back(t);
    }
    cin >> a >> b;
    dijkstra(a);
    printf("%.8lf\n", 100.0 / d[b]);
    return 0;
}

样例输出是

103.07153164

结果我的程序输出的是

0.00001000

 

题目链接:这里

题目:

1277   最小花费

题目描述 Description

在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。

输入描述 Input Description

第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。
以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100)。
最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。

输出描述 Output Description

输出A使得B到账100元最少需要的总费用。精确到小数点后8位。

样例输入 Sample Input


 

3 3
1 2 1
2 3 2
1 3 3
1 3

样例输出 Sample Output


 

103.07153164

数据范围及提示 Data Size & Hint

1<=n<=2000

 

我只要dijkstra优化模板的代码!

 

栾峻岩在2019-03-14 16:15:20追加了内容
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

const int MAXN = 2010;
const int INF = 10000000;
typedef pair<int, int> P;
 
struct edge {
    int to, cost;
};

vector<edge> G[MAXN];
priority_queue<P, vector<P>, greater<P> > q;
int d[MAXN] = {1}, n, m, x, y, z, a, b;

void dijkstra(int s) {
    fill(d + 1, d + n + 1, INF);
    d[s] = 1;
    q.push(P(1, s));
    while (!q.empty()) {
        P p = q.top();
        q.pop();
        int v = p.second;
        if (p.first < d[v])
            continue;
        for (int i = 0; i < G[v].size(); i++) {
            edge e = G[v][i];
            if (d[v] * e.cost > d[e.to]) {
                d[e.to] = d[v] * e.cost;
                q.push(P(d[e.to], e.to));
           }
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> x >> y >> z;
        edge t;
        t.to = y;
        t.cost = 1 - z / 100.0;
      	G[x].push_back(t);
        t.to = x;
        G[y].push_back(t);
    }
    cin >> a >> b;
    dijkstra(a);
    printf("%.8lf\n", 100.0 / d[b]);
    return 0;
}

 @贾文卓 改了还是不对啊。

样例输出没变

栾峻岩在2019-03-14 23:33:12追加了内容

@刘景程 

 

今天不是我生日啊,你是不是jfca?


0
已采纳
贾文卓
贾文卓
高级光能
高级光能

你再检查一下d数组的初始值,乘法的初始值不能是0!

0
栾峻岩
栾峻岩
初级天翼
初级天翼

@杨喆 @酷町喵~o( =∩ω∩= )o~ @贾敬波 @葛新 @黄俊博 @高翊天 @庄梓 @王子凡 @张瑀涵 @陆麟瑞 @贾文卓 @贾子昂 @刘济同 

0
0
0
我要回答