日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

HDU_1874_SPFA模板

 印度阿三17 2019-07-07

原理:

  • 在有向圖中,對于某個邊(u,v,w),若存在dist[v] < dist[u] w,滿足三角關(guān)系,
  • 若所有邊都滿足此不等式,說明一個點已經(jīng)無法通過任意聯(lián)通點來松弛它,則所有的dist就是最短路

來源:

  • dij不同的是,bellman-ford基于迭代思想
  • spfa是隊列優(yōu)化的bellman-ford

流程:

  1. 將源點加入隊列,
  2. 取出隊頭,掃描所有出邊(u,v,w),松弛:dist[v] > dist[u] w,若v點不在隊列中,加入隊列
  3. 隊列中保存了待擴展的節(jié)點,每一次節(jié)點的入隊都更新了一次dist數(shù)組,一個點可能多次入隊,不斷的迭代

鄰接表:

#include <iostream>
#include <string.h>
#include <queue>
#include <vector>

using namespace std;
const int maxn = 1e3;
const int INF = 0x3f3f3f3f;

queue<int> que;
bool vis[maxn];
int dist[maxn];
int n,m;
vector<pair<int,int> > e[maxn];

void spfa() {
	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);

	dist[1] = 0; vis[1] = 1;
	que.push(1);

	while (!que.empty()) {
		int cur = que.front(); que.pop();
		vis[cur] = 0;
		for (int i=0; i<e[cur].size(); i  ) {
			int to = e[cur][i].first;
			int div = e[cur][i].second;
			if (dist[to] > dist[cur]   div) {
				dist[to] = dist[cur]   div;
				if (!vis[to]) vis[to] = 1,que.push(to);
			}
		}
	}
	return ;
}

void read() {
	memset(e,0x3f,sizeof e);
	scanf("%d%d",&n,&m);
	for (int i=1; i<=m ;i  ) {
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		e[u].push_back( make_pair(v,w) );
	}
}

int main() {
	read();
	spfa();
	return 0;
}

鄰接矩陣 HDU 1874

#include <iostream>
#include <string.h>
#include <queue>

using namespace std;
const int maxn = 201;
const int INF = 0x3f3f3f3f;
int e[maxn][maxn];
int startp,endp;
bool vis[maxn];
int dist[maxn];
int n,m;

int spfa() {
	memset(vis,0,sizeof vis);
	memset(dist,0x3f,sizeof dist);

	dist[startp] = 0; vis[startp] = 1;
	queue<int> que;
	que.push(startp);

	while (!que.empty()) {
		int cur = que.front(); que.pop();
		vis[cur] = 0;
		for (int i=0; i<n; i  ) {
			if (e[cur][i] < INF && dist[i] > dist[cur]   e[cur][i]) {
				dist[i] = dist[cur]   e[cur][i];
				if (!vis[i]) que.push(i),vis[i] = 1;
			}
		}
	}
	return dist[endp];
}
int main() {
//	freopen("a.txt","r",stdin);
	while (scanf("%d%d",&n,&m) != EOF) {
		memset(e,0x3f,sizeof e);
		for (int i =1; i<=m; i  ) {
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			if (w < e[u][v]) e[u][v] = e[v][u] = w;
		}
		scanf("%d%d",&startp,&endp);
		int ans = spfa();
		if (ans < INF) printf("%d\n",ans);
		else printf("-1\n");
	}
	return 0;
}
來源:https://www./content-4-306501.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多