Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

提交一直WA, 看了别人的感觉跟自己一样, 优先队列BFS, 不知道哪里错了, 求神犇看看

Posted by Tanx at 2018-05-04 18:41:22 on Problem 3635
#include <cstdio>
#include <cassert>
#include <queue>
#include <cstring>
#include <vector>
#include <utility>
using namespace std;
typedef pair<int, int> P;
#define Fi first
#define pb push_back
#define Se second

const int MAX_N = 1000 + 10;
const int MAX_C = 100 + 10;
int d[MAX_N][MAX_C], n, m, cost[MAX_N], c, Q, s, t;
vector<pair<int, int> >G[MAX_N];

struct node {
    int city, fuel, cost;

    inline bool operator < (const node&x) const {
	return cost > x.cost;
    }
};

priority_queue<node> q;

int main() {
    //freopen("in", "r", stdin);
    //freopen("out", "w", stdout);

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) scanf("%d", cost + i);
    for (int i = 1; i <= m; ++i) {
	int u, v, C;
	scanf("%d%d%d", &u, &v, &C);
	G[u + 1].pb(P(v + 1, C));
	G[v + 1].pb(P(u + 1, C));
    }	

    scanf("%d", &Q);
    while (Q--) {
	scanf("%d%d%d", &c, &s, &t);
	++s, ++t;
	memset(d, -1, sizeof(d));
	while (!q.empty()) q.pop();
	d[s][0] = 0;
	q.push(node {s, 0, 0} );

	bool ok = false;
	while (!q.empty()) {
	    node p = q.top(); q.pop();
//	    assert (q.empty() || d[p.city][p.fuel] <= d[q.top().city][q.top().fuel]);
	    if (p.city == t) {
		printf("%d\n", p.cost);
		ok = true;
		break;
	    }
	    if (d[p.city][p.fuel] < p.cost) continue;
	    if (p.fuel < c && (d[p.city][p.fuel + 1] == - 1 || d[p.city][p.fuel + 1] > d[p.city][p.fuel] + cost[p.city])) {
		d[p.city][p.fuel + 1] = d[p.city][p.fuel] + cost[p.city];
		q.push(node {p.city, p.fuel + 1, d[p.city][p.fuel + 1]} );
	    }

	    for (const auto&i : G[p.city]) {
		if (p.fuel >= i.Se && (d[i.Fi][p.fuel - i.Se] == -1 || d[i.Fi][p.fuel - i.Se] > d[p.city][p.fuel])) {
		    d[i.Fi][p.fuel - i.Se] = d[p.city][p.fuel];
		    q.push(node {i.Fi, p.fuel - i.Se, d[i.Fi][p.fuel - i.Se]});
		}
	    }
	}
	if (!ok) puts("impossible");
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator