dijkstra & prim

幾天做到了最短路的問題,於是隨手放一個最短路的模板

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3;
//如果寫的是0x3f3f3f3f這中形式的話在更新的時候就需要判斷一下是否能到達 
//否則不能到達時加一下整形就溢出了 ,不過鏈式向前星存圖存的就是可以到達的//點,多此一舉了
const int inf=99999999;
struct Edge{
	int v,c,next;
}edge[maxn*maxn];
int head[maxn],dis[maxn],vis[maxn];
int s,e,tot,n,m;
void init()
{
	fill(head,head+maxn,-1);
	tot=0;
}
void addedge(int u,int v,int c)
{
	edge[tot].c=c;
	edge[tot].v=v;
	edge[tot].next=head[u];
	head[u]=tot++;
	
}
void dijkstra()
{
	fill(vis,vis+maxn,0);
	fill(dis,dis+maxn,inf);
//	如果題目要求求最短路徑, 就加上這一個怕pre數組 
//	for(int i=0;i<n;i++) pre[i]=i;
	//這裏要循環n次,雖然最後一次不需要更新,但也要找最後一個節點
	//在這是爲了防止出現圖不連通的情況 ,然後直接break
	dis[s]=0;
	for(int i=0;i<n;i++)
	{
		int u=-1,Min=inf;
		for(int j=0;j<n;j++)
		{
			if(!vis[j]&&dis[j]<Min)
			{
				Min=dis[j];
				u=j;
			}
			
		}
		
		if(u==-1) break;
		vis[u]=1;
		
		for(int j=head[u];j!=-1;j=edge[j].next)
		{
			int v=edge[j].v;
			if(!vis[v]&&dis[v]>dis[u]+edge[j].c)
			{
				dis[v]=dis[u]+edge[j].c;
				//pre[v]=u; 
			}
		}	 
	}	
}

稍微修改一下就是最小生成樹的代碼了

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3;
//如果寫的是0x3f3f3f3f這中形式的話在更新的時候就需要判斷一下是否能到達 
//否則不能到達時加一下整形就溢出了 ,不過鏈式向前星存圖存的就是可以到達的//點,多此一舉了
const int inf=0x3f3f3f3f;
struct Edge{
	int v,c,next;
}edge[maxn*maxn];
int head[maxn],dis[maxn],vis[maxn];
int s,e,tot,n,m;
void init()
{
	fill(head,head+maxn,-1);
	tot=0;
}
void addedge(int u,int v,int c)
{
	edge[tot].c=c;
	edge[tot].v=v;
	edge[tot].next=head[u];
	head[u]=tot++;
	
}
int sum=0;
void dijkstra()
{
	fill(vis,vis+maxn,0);
	fill(dis,dis+maxn,inf);
	//這裏要循環n次,雖然最後一次不需要更新,但也要找最後一個節點
	//在這是爲了防止出現圖不連通的情況 
	dis[s]=0;
	for(int i=0;i<n;i++)
	{
		int u=-1,Min=inf;
		for(int j=0;j<n;j++)
		{
			if(!vis[j]&&dis[j]<Min)
			{
				Min=dis[j];
				u=j;
			}
			
		}
		
		if(u==-1) break;
		vis[u]=1;
		sum+=dis[u];
		
		for(int j=head[u];j!=-1;j=edge[j].next)
		{
			int v=edge[j].v;
			if(!vis[v]&&dis[v]>edge[j].c)
			{
				dis[v]=edge[j].c;
			}
		}	 
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章