萌新求助全 WA,SPFA + 二分
查看原帖
萌新求助全 WA,SPFA + 二分
114914
一只书虫仔楼主2020/7/11 17:09

听到了说是点权之和二分,但是我写出来的代码没有地方可以用上 fif_i

所以求助一下大佬,在哪里加上 fif_i

(并且我这个代码有几个 RE 的 qwq)

#include <bits/stdc++.h>

using namespace std;

struct node {
	int val, next, length;
} e[100086];

int n, m, b, cnt;
int f[10086];
int head[50086];
int dist[50086], sum[50086];
const int inf = 0x3f3f3f3f;

void AddEdge (int u, int v, int w) {
	e[++cnt].val = v;
    e[cnt].next = head[u];
    e[cnt].length = w;
    head[u] = cnt;
}

struct cmp {
    bool operator () (int a, int b) {
        return dist[a] > dist[b];
    }
};

priority_queue <int, vector<int>, cmp> q;

void SPFA () {
	for (int i = 1; i <= n; i++)
		dist[i] = inf;
	int s = 1;
	dist[s] = 0;
	sum[s] = 1;
	q.push(s);
	while (!q.empty()) {
		int cur = q.top();
		q.pop();
		sum[cur] = 0;
		for (int p = head[cur]; p > 0; p = e[p].next)
			if (dist[e[p].val] > dist[cur] + e[p].length) {
				dist[e[p].val] = dist[cur] + e[p].length;
				if (!sum[e[p].val]) {
					q.push(e[p].val);
					sum[e[p].val] = 1;
				}
			}
	}
}

int main () {
	scanf("%d%d%d", &n, &m, &b);
	for (int i = 1; i <= n; i++)
		scanf("%d", &f[i]);
	for (int i = 1, u, v, w; i <= n; i++) {
		scanf("%d%d%d", &u, &v, &w);
		AddEdge(u, v, w);
		AddEdge(v, u, w);
	}
	SPFA();
	if (dist[n] <= b) {
		printf("AFK");
		return 0;
	}
	int low = 0, high = 1e9;
	while (low <= high) {
		int mid = (low + high) / 2;
		if (dist[mid] <= b)
			high = mid - 1;
		else
			low = mid + 1;
	}
	printf("%d", low);
	return 0;
}
2020/7/11 17:09
加载中...