最短路径问题

dijkstra模板

void dijkstra(int iu){
	memset(d,88,sizeof(d));
	memset(vis,0,sizeof(vis));
	d[iu]=0;
	q.push({iu,0});
	while(!q.empty()){
		int x=q.top().u;
		q.pop();
		vis[x]=true;
		for(int i=0;i<g[x].size();i++){
			int iv=g[x][i].v,iw=g[x][i].w;
			if(!vis[iv]&&d[x]+iw<d[iv]){
				d[iv]=d[x]+iw;
				q.push({iv,d[iv]});
			}
		}
	}
}

floyd模板

void floyd(){
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i==k||i==j||j==k)continue;
				if(dis[i][k]+dis[k][j]<dis[i][j]){
					dis[i][j]=dis[i][k]+dis[k][j];
					dis[j][i]=dis[i][j];
				}
			}
		}
	}
}

【USACO】热浪

#include<bits/stdc++.h>
using namespace std;
int n,cnt,m,d[3005],ans,s,e;
bool vis[3005];
struct node{
	int u,dist;
};
struct cmp{
	bool operator()(node a,node b){
		return a.dist>b.dist;
	}
};
struct node2{
	int v,w;
	
};
priority_queue<node,vector<node>,cmp> q;
vector<node2> g[3005]; 
void dijkstra(int iu){
	memset(d,88,sizeof(d));
	memset(vis,0,sizeof(vis));
	d[iu]=0;
	q.push({iu,0});
	while(!q.empty()){
		int x=q.top().u;
		q.pop();
		vis[x]=true;
		for(int i=0;i<g[x].size();i++){
			int iv=g[x][i].v,iw=g[x][i].w;
			if(!vis[iv]&&d[x]+iw<d[iv]){
				d[iv]=d[x]+iw;
				q.push({iv,d[iv]});
			}
		}
	}
}
int main(){
	cin>>n>>m>>s>>e;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		g[x].push_back({y,z});
		g[y].push_back({x,z});
	}
	dijkstra(s);
	cout<<d[e]<<endl;
	return 0;
}


```#include<bits/stdc++.h>
using namespace std;
int n,cnt,m,d[3005],ans,s,e;
bool vis[3005];
struct node{
	int u,dist;
};
struct cmp{
	bool operator()(node a,node b){
		return a.dist>b.dist;
	}
};
struct node2{
	int v,w;
	
};
priority_queue<node,vector<node>,cmp> q;
vector<node2> g[3005]; 
void dijkstra(int iu){
	memset(d,88,sizeof(d));
	memset(vis,0,sizeof(vis));
	d[iu]=0;
	q.push({iu,0});
	while(!q.empty()){
		int x=q.top().u;
		q.pop();
		vis[x]=true;
		for(int i=0;i<g[x].size();i++){
			int iv=g[x][i].v,iw=g[x][i].w;
			if(!vis[iv]&&d[x]+iw<d[iv]){
				d[iv]=d[x]+iw;
				q.push({iv,d[iv]});
			}
		}
	}
}
int main(){
	cin>>n>>m>>s>>e;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		g[x].push_back({y,z});
		g[y].push_back({x,z});
	}
	dijkstra(s);
	cout<<d[e]<<endl;
	return 0;
}

floyd

#include<bits/stdc++.h>
using namespace std;
int n,m,s,e;
int dis[405][405],g[405][405];
void floyd(){
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i==k||i==j||j==k)continue;
				if(dis[i][k]+dis[k][j]<dis[i][j]){
					dis[i][j]=dis[i][k]+dis[k][j];
					dis[j][i]=dis[i][j];
				}
			}
		}
	}
}
int main(){
	cin>>n>>m>>s>>e;
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		dis[x][y]=z;
		dis[y][x]=z;
	}
	floyd();
	cout<<dis[s][e]<<endl;
	return 0;
}


posted @ 2023-08-04 15:49  蒋子轩  阅读(18)  评论(0编辑  收藏  举报