强化阶段 Day 23 算法笔记 10.4 最短路径

目录

1.dijkstra邻接矩阵

2.Emergency

3.Travel Plan

4.bellman ford

5.Emergency(bellman)

6.spfa

7.Floyd


1.dijkstra邻接矩阵

int n,g[maxv][maxv];
int d[maxv];
bool vis[maxv]={false};

void dijkstra(int s){
	fill(d,d+maxv,inf);
	d[s]=0;
	for(int i=0;i

2.Emergency

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

const int maxv=1000;
const int nf=1000000000;

int n,m,st,ed,g[maxv][maxv],weight[maxv];
int d[maxv],w[maxv],num[maxv];
bool vis[maxv]={false};

void dijkstra(int s){
	fill(d,d+maxv,nf);
	memset(num,0,sizeof(num));
	memset(w,0,sizeof(w));
	d[s]=0;
	w[s]=weight[s];
	num[s]=1;
	for(int i=0;iw[v]){
						w[v]=w[u]+weight[v];
					}
					num[v]+=num[u];
				}
			}
		}
	}
}

int main(){
	
	scanf("%d%d%d%d",&n,&m,&st,&ed);
	for(int i=0;i

3.Travel Plan

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

const int maxv=505;
const int inf=1000000000;

int n,m,st,ed;
int g[maxv][maxv],cost[maxv][maxv];
int d[maxv],c[maxv];
bool vis[maxv]={false};

vector pre[maxv];
void dijkstra(int st){
	fill(d,d+maxv,inf);
	d[st]=0;
	for(int i=0;i temppath,path;
int mincost=inf;
void dfs(int ed){
	if(ed==st){
		temppath.push_back(ed);
		int tempcost=0;
		for(int i=temppath.size()-1;i>0;i--){
			int id=temppath[i],idnext=temppath[i-1];
			tempcost+=cost[id][idnext];
		}
		if(tempcost=0;i--){
		printf("%d ",path[i]);
	}
	printf("%d %d",d[ed],mincost);
	
	
	
	return 0;
	
}
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

const int maxv=505;
const int inf=1000000000;

int n,m,st,ed;
int g[maxv][maxv],cost[maxv][maxv];
int d[maxv],c[maxv];
bool vis[maxv]={false};
int pre[maxv];

void dijkstra(int s){
	fill(d,d+maxv,inf);
	fill(c,c+maxv,inf);
	for(int i=0;ic[u]+cost[u][v]){
						c[v]=c[u]+cost[u][v];
						pre[v]=u;
					}
				}
			}
		}
	}
}

void dfs(int v){
	if(v==st){
		printf("%d ",v);
		return;
	}
	dfs(pre[v]);
	printf("%d ",v);
}

int main(){
	
	scanf("%d%d%d%d",&n,&m,&st,&ed);
	int u,v;
	fill(g[0],g[0]+maxv*maxv,inf);
	fill(cost[0],cost[0]+maxv*maxv,inf);
	for(int i=0;i

4.bellman ford

struct node{
	int v,dis;
};
const int maxv=5005;
const int inf=100000000;
vector adj[maxv];

int n;
int d[maxv];

bool bellman(int s){
	fill(d,d+maxv,inf);
	d[s]=0;
	for(int i=0;i

5.Emergency(bellman)

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

const int maxv=505;
const int inf=0x3fffffff;

struct node{
	int v,dis;
	node(int _v,int _dis) : v(_v),dis(_dis) {}
};
vector adj[maxv];

int n,m,st,ed,weight[maxv];
int d[maxv],w[maxv],num[maxv];
set pre[maxv];

void bellman(int s){
	fill(d,d+maxv,inf);
	memset(num,0,sizeof(num));
	memset(w,0,sizeof(w));
	d[s]=0;
	w[s]=weight[s];
	num[s]=1;
	for(int i=0;iw[v]){
						w[v]=w[u]+weight[v];
					}
					pre[v].insert(u);
					num[v]=0;
					set::iterator it;
					for(it=pre[v].begin();it!=pre[v].end();it++){
						num[v]+=num[*it];
					}
				}
			}
		}
	}
}

int main(){
	scanf("%d%d%d%d",&n,&m,&st,&ed);
	for(int i=0;i

6.spfa

bool spfa(int s){
	fill(d,d+maxv,inf);
	memset(inq,false,sizeof(inq));
	memset(num,0,sizeof(num));
	
	queue q;
	q.push(s);
	inq[s]=true;
	num[s]++;
	d[s]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		inq[u]=false;
		for(int j=0;jn) return false;
				}
			}
		}
	}
	return true;
}

7.Floyd

void floyd(){
	for(int k=0;k

你可能感兴趣的:(算法,图论,数据结构)