最短路的母題,包含四種模板。

題目描述

現在有n個結點,m條無向邊,其中1<n<1000,1<m<5003,起點是1,終點是n。求1到n的最短路徑。

輸入樣例

5 6
1 2 2
2 3 3
2 5 5
3 4 2
3 5 1
4 5 1

輸出樣例

6

dijkstra

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
int e[N][N],n,m;
void init(){
	rep(i,1,n)	rep(j,1,n){
		e[i][j] = i == j ? 0 : inf ;
	}
}
int dijkstra(int stra,int end){
	int dis[N],minv,minx; bool vis[N];
	rep(i,2,n)	dis[i] = inf; 
	dis[1] = 0 ; 
	mset(vis,0);
	for (int ai = 1; ai <= n; ai++){
		minv = inf; 
		for (int bi = 1; bi <= n; bi++){
			if ( vis[bi] == 0 && minv > dis[bi]){
				minv = dis[bi];		minx = bi ;
			}
		}
		vis[minx] = 1; 
		for (int bi = 1; bi <= n; bi++){
			if ( vis[bi] == 0 && dis[bi] > dis[minx] + e[minx][bi] ){
				dis[bi] = dis[minx] + e[minx][bi];
			}
		}
	}
	return dis[n]; 
}
int main()
{
	n = read(); m = read();
	init();
	rep(i,1,m){
		int a,b,c; 
		a = read(); b = read(); c = read();
		e[a][b] = e[b][a] = c; 
	}
	printf("%d\n",dijkstra(1,n));
	return 0;
}

bellman_ford

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
int n,m;int dis[N];
struct {
	int u,v,w; 
}e[10009];
void init(){

}
int bell_man(int stra,int end){
	
	mset(dis,0x3f);
	dis[stra] = 0; 
	for (int ai = 1; ai <= n; ai++){
		for (int bi = 1; bi <= 2*m; bi++){
			if ( dis[e[bi].v] > dis[e[bi].u] + e[bi].w ){
				dis[e[bi].v] = dis[e[bi].u] + e[bi].w;
			}
		}
	}
	return dis[end];
}
int main()
{
//	freopen("D:\\垃圾程序存儲\\1.txt","r",stdin);
//	srand((int)time(0));
//	std::ios::sync_with_stdio(false);
	n = read(); m = read();
	init();
	rep(i,1,m){
		int a,b,c; 
		a = read(); b = read(); c = read();
		e[i].u = a; e[i].v = b; e[i].w = c; 
		e[i+m].u = b ; e[i+m].v = a; e[i+m].w = c; 
	}
	printf("%d\n",bell_man(1,n));
	return 0;
}

SPFA

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
int n,m;
struct Ead{
	int u,v,w,nx;
}e[10009];int hea[1003];int tot = 0 ; 
void init(){
	tot = 0 ; mset(hea,0);
}
void add_ead(int u,int v,int w){
	++tot; 
	e[tot].u = u ; e[tot].v = v; e[tot].w = w; e[tot].nx = hea[u] ; hea[u] = tot; 
}
int SPFA(int stra,int end){
	int dis[N];bool inq[N];
	mset(dis,0x3f);
	mset(inq,0);
	queue<int>q;
	inq[stra] = 1; dis[stra] = 0; 
	q.push(stra);
	while ( !q.empty() ){
		int u = q.front(); q.pop(); 
		inq[stra] = 0 ; 
		for (int i = hea[u] ; i ; i = e[i].nx){
			if ( dis[e[i].v] > dis[e[i].u] + e[i].w){
				dis[e[i].v] = dis[e[i].u] + e[i].w;
				if ( !inq[e[i].v]){
					q.push(e[i].v);
				}
			}
		}
	} 
	return dis[end];
}
int main()
{
	n = read(); m = read();
	init();
	rep(i,1,m){
		int a,b,c; 
		a = read(); b = read(); c = read();
		add_ead(a,b,c);
		add_ead(b,a,c);
	}
	printf("%d\n",SPFA(1,n));
	return 0;
}

dijkstra + priority_queue

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
#define M 5009
int n,m;
struct Ead{
	int u,v,w,nx;
	Ead() {}
	Ead(int _u,int _v,int _w,int _nx){
		u = _u ; 
		v = _v ; 
		w = _w; 
		nx = _nx; 
	}

}e[10009];
struct Node {
	int u,w; 
	bool operator < (const Node &x )const{
		return w > x.w;
	}	
	Node (int _u,int _w){
		 u = _u ; 
		 w = _w ; 
	}
};
int hea[1003];int tot = 0 ; 
void init(){
	tot = 0 ; mset(hea,0);
}
void add_ead(int u,int v,int w){
	++tot; 
	e[tot].u = u ; e[tot].v = v; e[tot].w = w; e[tot].nx = hea[u] ; hea[u] = tot; 
}
int dijkstra(int stra,int end){
	int dis[N];
	mset(dis,0x3f);
	dis[stra] = 0 ;	
	priority_queue<Node> q; 
	q.push(Node(stra,0));
	while ( !q.empty() ){
		Node x = q.top() ; q.pop();
		if ( x.w != dis[x.u] )	continue; 
		for (int i = hea[x.u] ; i ; i = e[i].nx){
			if ( dis[e[i].v] > dis[e[i].u] + e[i].w){
				dis[e[i].v] = dis[e[i].u] + e[i].w; 
				q.push(Node(e[i].v,dis[e[i].v]));
			}
		}
	}	
	return dis[end];
}
int main()
{
//	freopen("D:\\垃圾程序存儲\\1.txt","r",stdin);
//	srand((int)time(0));
//	std::ios::sync_with_stdio(false);
	n = read(); m = read();
	init();
	rep(i,1,m){
		int a,b,c; 
		a = read(); b = read(); c = read();
		add_ead(a,b,c);
		add_ead(b,a,c);
	}
	printf("%d\n",dijkstra(1,n));
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章