图论——最短路算法板子

已经不打了,这些东西放到草稿箱里也没啥意义了,那就发出来吧,说不定某些正在努力的同学喜欢看这种代码风格

初始化

void init(){
    
    
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=n;j++){
    
    
			if(i==j)map[i][j]=0;
			else{
    
    
				map[i][j]=map[j][i]=inf;
			}
		}
	}
}

贪心dijikstra算法

int dijkstra(){
    
    
	memset(vis,0,sizeof vis);
	for(int i=1;i<=n;i++)
	dis[i]=map[1][i];
	vis[1]=1;
	for(int i=0;i<n;i++){
    
    
		int N=inf;
		int pos;
		for(int j=1;j<=n;j++){
    
    
			if(!vis[j]&&N>dis[j]){
    
    
				N=dis[j];
				pos=j;
			}
		}
		vis[pos]=1;
		for(int j=1;j<=n;j++){
    
    
			if(!vis[j]&&dis[pos]+map[pos][j]<dis[j])
			dis[j]=dis[pos]+map[pos][j];
		}
	}
	return dis[n];
}

带堆优化

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

const int maxn=150000+7;
int vis[maxn],dis[maxn],head[maxn];
struct Node{
    
    
	int dis,u;
	bool operator <(const Node &a)const{
    
    
	return dis>a.dis;
	}
};
struct Edge{
    
    
	int to,cost,next;
};
Edge edge[maxn];
const int inf=0x3f3f3f3f;
int n,m,cnt;

void init(){
    
    
	memset(head,-1,sizeof head);
	cnt=0;
}

void add(int u,int v,int w){
    
    
	edge[cnt].to=v;
	edge[cnt].cost=w;
	edge[cnt].next=head[u];
	head[u]=cnt++;
}

void dijkstra(){
    
    
	memset(vis,0,sizeof vis);
	for(int i=1;i<=n;i++)
	dis[i]=inf;
	dis[1]=0;
	priority_queue<Node>q;
	Node now;
	now.u=1;now.dis=0;
	q.push(now);
	while(!q.empty()){
    
    
		now=q.top();
		q.pop();
		int u=now.u;
		if(vis[u])continue;
		vis[u]=1;
		for(int j=head[u];j!=-1;j=edge[j].next){
    
    
			int v=edge[j].to;
			Node next;
			if(!vis[v]&&dis[v]>dis[u]+edge[j].cost){
    
    
				dis[v]=dis[u]+edge[j].cost;
				next.u=v;next.dis=dis[v];
				q.push(next);
			}
		}
	}
}

int main(){
    
    
	scanf("%d%d",&n,&m);
	init();
	int u,v,w;
	for(int i=0;i<m;i++){
    
    
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	dijkstra();
	printf("%d\n",dis[n]);
	
	return 0;
}

spfa

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

int n,m;
const int maxn=1000+7;
const int inf=0x3f3f3f3f;
int vis[maxn];
int num[maxn];
int dis[maxn];
struct Edge{
    
    
	int to,cost,next;
};
Edge edge[200005];
int head[maxn];
int cnt;

void init(){
    
    
	memset(head,-1,sizeof head);
	cnt=0;
}

void add(int u,int v,int w){
    
    
    edge[cnt].to=v;
    edge[cnt].cost=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}

int spfa(){
    
    
	memset(vis,0,sizeof vis);
	memset(num,0,sizeof num);
	for(int i=1;i<=n;i++)
	dis[i]=0;
	dis[1]=inf;vis[1]=1;
	queue<int>q;
	q.push(1);
	while(!q.empty()){
    
    
		int u=q.front();
		q.pop();
		vis[u]=0;
		int v;
		for(int j=head[u];j!=-1;j=edge[j].next){
    
    
			v=edge[j].to;
			int m=min(dis[u],edge[j].cost);
			if(m>dis[v]){
    
    
				dis[v]=m;
				if(!vis[v]){
    
    
					q.push(v);
					vis[v]=1;
					if(++num[v]>n)return 0;
				}
			}
		}
	}
	return 1;
}

int main(){
    
    
	int T;
	scanf("%d",&T);
	int u,v,w;
	for(int cas=0;cas<T;cas++){
    
    
		init();
		scanf("%d%d",&n,&m);
		for(int i=0;i<m;i++){
    
    
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
			add(v,u,w);
		}
		spfa();
		printf("Scenario #%d:\n%d\n\n",cas+1,dis[n]);
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/peizhecpp/article/details/105168385