0
点赞
收藏
分享

微信扫一扫

AcWing 4243. 传递信息(单源最短路)

全栈顾问 2022-02-18 阅读 95

题目连接

https://www.acwing.com/problem/content/description/4246/

http://poj.org/problem?id=1502

思路

没啥好说的就是一个裸的求单源最短路,只不过边的信息建立需要自己判断是否存在,范围在100以内,那么基本上所有的最短路都能过,我这里就给出迪杰斯特拉和Floyd的代码

代码

迪杰斯特拉

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define PII pair<int,int>
const int INF = 0x3f3f3f3f;
const int N = 1e2+10;

int n,dis[N];
bool vis[N];

struct Node{
	int v,w;
};
vector<Node> E[N];

int toint(string s){
	int res = 0;
	for(int i = 0,l = s.size();i < l; ++i) res = res * 10 + s[i] - '0';
	return res;
}

void DJ(int s){
	for(int i = 1;i <= n; ++i) dis[i] = INF;
	priority_queue<PII,vector<PII>,greater<PII> > que;
	que.push({0,s});
	dis[s] = 0;
	while(!que.empty()){
		int t = que.top().second;
		que.pop();
		if(vis[t]) continue;
		vis[t] = true;
		for(int i = 0,l = E[t].size();i < l; ++i) {
			int j = E[t][i].v;
			int w = E[t][i].w;
			if(dis[j] > dis[t] + w){
				dis[j] = dis[t] + w;
				que.push({dis[j],j});
			}
		}
	}
}



int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	string num;
	for(int i = 2;i <= n; ++i)
		for(int j = 1;j < i; ++j){
			cin>>num;
			if(num != "x"){
				int w = toint(num);
				E[i].push_back({j,w});
				E[j].push_back({i,w});
			}
		}
	DJ(1);
	int ans = 0;
	for(int i = 1;i <= n; ++i) ans = max(ans,dis[i]);
	cout<<ans<<endl;
	return 0;
}

Floyd

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define PII pair<int,int>
const int INF = 0x3f3f3f3f;
const int N = 1e2+10;

int n,f[N][N];


int toint(string s){
	int res = 0;
	for(int i = 0,l = s.size();i < l; ++i) res = res * 10 + s[i] - '0';
	return res;
}

void Floyd(){
	for(int k = 1;k <= n; ++k) 
		for(int i = 1;i <= n; ++i) 
			for(int j = 1;j <= n; ++j)
				f[i][j] = min(f[i][k] + f[k][j],f[i][j]);
}



int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i = 1;i <= n; ++i)
		for(int j = 1;j <= n; ++j)
			f[i][j] = i==j?0:INF;
	string num;
	for(int i = 2;i <= n; ++i)
		for(int j = 1;j < i; ++j){
			cin>>num;
			if(num != "x")
				f[i][j] = f[j][i] = min(f[i][j],toint(num));
		}
	Floyd();
	int ans = 0;
	for(int i = 1;i <= n; ++i) ans = max(ans,f[1][i]);
	cout<<ans<<endl;
	return 0;
}
举报

相关推荐

0 条评论