分享

HDU_1874_SPFA模板

 印度阿三17 2019-07-07

原理:

  • 在有向图中,对于某个边(u,v,w),若存在dist[v] < dist[u] w,满足三角关系,
  • 若所有边都满足此不等式,说明一个点已经无法通过任意联通点来松弛它,则所有的dist就是最短路

来源:

  • dij不同的是,bellman-ford基于迭代思想
  • spfa是队列优化的bellman-ford

流程:

  1. 将源点加入队列,
  2. 取出队头,扫描所有出边(u,v,w),松弛:dist[v] > dist[u] w,若v点不在队列中,加入队列
  3. 队列中保存了待扩展的节点,每一次节点的入队都更新了一次dist数组,一个点可能多次入队,不断的迭代

邻接表:

#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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多