spfa

struct Spfa {
	struct Edge {
		int next, to, w;
	} e[maxm];
	int head[maxn], v[maxn], d[maxn], tol;

	void add(int u, int v, int w) {
		tol++;
		e[tol].to = v;
		e[tol].next = head[u];
		e[tol].w = w;
		head[u] = tol;
	}

	queue<int> q;

	int spfa(int s, int t) {
		memset(d, 0x3f, sizeof(d));
		memset(v, 0, sizeof(v));
		d[s] = 0;
		v[s] = 1;
		q.push(s);
		while (!q.empty()) {
			int x = q.front();
			q.pop();
			v[x] = 0;
			for (int i = head[x]; i; i = e[i].next) {
				if (d[e[i].to] > d[x] + e[i].w) {
					d[e[i].to] = d[x] + e[i].w;
					if (v[e[i].to] == 0) {
						v[e[i].to] = 1;
						q.push(e[i].to);
					}
				}
			}
		}
		return d[t] == 0x3f ? -1 : d[t];
	}

	void init() {
		memset(head, 0, sizeof(head));
		tol = 0;
	}
} S;

  

posted @ 2019-07-17 20:18  Snow_in_winer  阅读(138)  评论(0编辑  收藏  举报