图论算法学习笔记

LightDirection / 2024-02-04 / 原文

dijk template

#include<iostream>
#include<climits>
#include<cmath>
#include<queue>
#include<vector>
#define ll long long
struct Node{
	int to,far;
};
std::vector<ll>dijk(std::vector<std::vector<Node>>G,int n,int start){
	std::vector<ll>dist(n+1,INT_MAX);
	std::vector<bool>vis(n+1,0);
	std::priority_queue<std::pair<ll,ll>,std::vector<std::pair<ll,ll>>,std::greater<std::pair<ll,ll>>>q;
	q.push(std::make_pair(0,start));
	dist[start]=0;
	while(q.size()){
		ll from=q.top().second;
		q.pop();
		if(vis[from]){
			continue;
		}
		vis[from]=1;
		for(auto i:G[from]){
			if(dist[i.to]>dist[from]+i.far){
				dist[i.to]=dist[from]+i.far;
				q.push(std::make_pair(dist[i.to],i.to));
			}
		}
	}
	return dist;
}

ybt 1376

floyd

#include<iostream>
#include<climits>
#include<cstring>
#include<queue>
#include<vector>
#define infinity 0x3f3f3f3f
#define N 105
int n,m,G[N][N],dist[N][N];
int main(){
	memset(dist,infinity,sizeof(dist));
	std::cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b,c;
		std::cin>>a>>b>>c;
		G[a][b]=G[b][a]=c;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j){
				G[i][j]=0;
			}else if(G[i][j]){
				dist[i][j]=G[i][j];
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				if(dist[j][k]>dist[j][i]+dist[i][k]){
					dist[j][k]=dist[j][i]+dist[i][k];
				}
			}
		}
	}
	int res=INT_MIN;
	for(int i=1;i<=n;i++){
		if(dist[1][i]==infinity){
			std::cout<<-1;
			return 0;
		}else{
			res=std::max(res,dist[1][i]);
		}
	}
	std::cout<<res;
}

dijk

#include<iostream>
#include<climits>
#include<cmath>
#include<queue>
#include<vector>
#define ll long long
struct Node{
	int to,far;
};
std::vector<ll>dijk(std::vector<std::vector<Node>>G,int n,int start){
	std::vector<ll>dist(n+1,INT_MAX);
	std::vector<bool>vis(n+1,0);
	std::priority_queue<std::pair<ll,ll>,std::vector<std::pair<ll,ll>>,std::greater<std::pair<ll,ll>>>q;
	q.push(std::make_pair(0,start));
	dist[start]=0;
	while(q.size()){
		ll from=q.top().second;
		q.pop();
		if(vis[from]){
			continue;
		}
		vis[from]=1;
		for(auto i:G[from]){
			if(dist[i.to]>dist[from]+i.far){
				dist[i.to]=dist[from]+i.far;
				q.push(std::make_pair(dist[i.to],i.to));
			}
		}
	}
	return dist;
}
int main(){
	int n,m;
	std::cin>>n>>m;
	std::vector<std::vector<Node>>G(n+1);
	for(int i=0;i<m;i++){
		int from,to,far;
		std::cin>>from>>to>>far;
		G[from].push_back(Node{to,far});
		G[to].push_back(Node{from, far});
	}
	std::vector<ll>f=dijk(G,n,1);
	ll res=INT_MIN;
	for(int i=1;i<=n;i++){
		res=std::max(res,f[i]);
	}
	if(res==INT_MIN)std::cout<<-1;
	else std::cout<<res;
}

luogu p1828

堆优化dijk

#include<iostream>
#include<climits>
#include<cmath>
#include<queue>
#include<vector>
#define ll long long
#define N 105
struct Node{
	int to,far;
};
int cnt[N];
std::vector<ll>dijk(std::vector<std::vector<Node>>G,int n,int start){
	std::vector<ll>dist(n+1,INT_MAX);
	std::vector<bool>vis(n+1,0);
	std::priority_queue<std::pair<ll,ll>,std::vector<std::pair<ll,ll>>,std::greater<std::pair<ll,ll>>>q;
	q.push(std::make_pair(0,start));
	dist[start]=0;
	while(q.size()){
		ll from=q.top().second;
		q.pop();
		if(vis[from]){
			continue;
		}
		vis[from]=1;
		for(auto i:G[from]){
			if(dist[i.to]>dist[from]+i.far){
				dist[i.to]=dist[from]+i.far;
				q.push(std::make_pair(dist[i.to],i.to));
			}
		}
	}
	return dist;
}
int main(){
	int n,p,c;
	std::cin>>n>>p>>c;
	std::vector<std::vector<Node>>G(p+1);
	for(int i=1;i<=n;i++){
		int x;
		std::cin>>x;
		cnt[x]++;
	}
	for(int i=1;i<=c;i++){
		int u,v,w;
		std::cin>>u>>v>>w;
		G[u].push_back(Node{v,w});
		G[v].push_back(Node{u,w});
	}
	int minn=1<<30;
	for(int i=1;i<=p;i++){
		std::vector<ll>dist=dijk(G,p,i);
		int sum=0;
		for(int j=1;j<=p;j++){
			sum+=(dist[j]*cnt[j]);
		}
		minn=std::min(sum,minn);
	}
	std::cout<<minn;
}

luogu b3647

floyd

#include<iostream>
#define infinity 0x3f3f3f3f
#define N 105
int G[N][N];
int main(){
	int n,m;
	std::cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j){
				G[i][j]=0;
			}else{
				G[i][j]=infinity;
			}
		}
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		std::cin>>u>>v>>w;
		G[u][v]=std::min(G[u][v],w);
		G[v][u]=std::min(G[v][u],w);
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(G[i][j]>G[i][k]+G[k][j]){
					G[i][j]=G[i][k]+G[k][j];
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			std::cout<<G[i][j]<<' ';
		}
		std::cout<<std::endl;
	}
}