【hdu】1874 畅通工程续 - 最短路 - Spfa算法 or Dijkstra算法 or Floyd算法

畅通工程续

模板题

算法学习以及模板来自qscqesze的视频。

Spfa算法代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
const int INF = 1e9;
vector <pair <int, int> > E[MAXN];
int n, m;
int dis[MAXN], inq[MAXN];
void Init(){
	for(int i = 0; i < MAXN; i++)
		E[i].clear();
	for(int i = 0; i < MAXN; i++)
		inq[i] = 0;
	for(int i = 0; i < MAXN; i++)
		dis[i] = INF;
}
int main(){
	while(~scanf("%d %d", &n, &m)){
		Init();
		for(int i = 0; i < m; i++){
			int x, y, z;
			scanf("%d%d%d", &x, &y ,&z);
			E[x].push_back(make_pair(y, z));
			E[y].push_back(make_pair(x, z));
		}
		int s, t;
		scanf("%d %d", &s, &t);
		queue <int> Q;
		Q.push(s);
		dis[s] = 0;
		inq[s] = 1;
		while(!Q.empty()){
			int now = Q.front();
			Q.pop();
			inq[now] = 0;
			for(int i = 0;i < E[now].size(); i++){
				int v = E[now][i].first;
				if(dis[v] > dis[now] + E[now][i].second){
					dis[v] = dis[now] + E[now][i].second;
					if(inq[v] == 1)
						continue;
					else 
						inq[v] = 1;
					Q.push(v);
				}
			}
		}
		if(dis[t] == INF)
			printf("-1\n");
		else 
			printf("%d\n", dis[t]);
	}
	return 0;
}

Dijkstra算法代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
const int INF = 1e9;
vector <pair <int, int> > E[MAXN];
int n, m;
int dis[MAXN];
void Init(){
	for(int i = 0; i < MAXN; i++)
		E[i].clear();
	for(int i = 0; i < MAXN; i++)
		dis[i] = INF;
}
int main(){
	while(~scanf("%d %d", &n, &m)){
		Init();
		for(int i = 0; i < m; i++){
			int x, y, z;
			scanf("%d%d%d", &x, &y ,&z);
			E[x].push_back(make_pair(y, z));
			E[y].push_back(make_pair(x, z));
		}
		int s, t;
		scanf("%d %d", &s, &t);
		priority_queue <pair <int, int> > Q;
		dis[s] = 0;
		Q.push(make_pair(-dis[s], s));
		while(!Q.empty()){
			int now = Q.top().second;
			Q.pop();
			for(int i = 0;i < E[now].size(); i++){
				int v = E[now][i].first;
				if(dis[v] > dis[now] + E[now][i].second){
					dis[v] = dis[now] + E[now][i].second;
					Q.push(make_pair(-dis[v], v));
				}
			}
		}
		if(dis[t] == INF)
			printf("-1\n");
		else 
			printf("%d\n", dis[t]);
	}
	return 0;
}

Floyd算法代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 205;
const int INF = 1e9+7;
int n, m;
int mp[MAXN][MAXN];

int main(){
	while(~scanf("%d %d", &n, &m)){
		for(int i = 0; i <n; i++){
			for(int j = 0; j < n; j++){
				if(i == j)
					mp[i][j] = 0;
				else 
					mp[i][j] = INF;
			}
		}
		
		for(int i = 1; i <= m; i++){
			int x, y, z;
			scanf("%d %d %d", &x, &y, &z);
			mp[x][y] = min(z, mp[x][y]);
			mp[y][x] = min(z, mp[y][x]);
		}
		
		for(int k = 0; k < n; k++){
			for(int i = 0; i < n; i++){
				for(int j = 0; j < n; j++){
					mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
				}
			}
		}
		int s, t;
		scanf("%d %d", &s, &t);
		if(mp[s][t] == INF)
			printf("-1\n");
		else 
			printf("%d\n", mp[s][t]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Zy_Ming/article/details/82391012
今日推荐