最短路HDU1874通工程续

中文题。裸裸的最短路,练习各种模板。

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874

Floyd

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
const int INF=0xfffffff;
int n;
int dp[1111][11111];
void fly()
{
	for(int k=0;k<n;k++)
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(dp[i][j]>dp[i][k]+dp[k][j])
				dp[i][j]=dp[i][k]+dp[k][j];
		}
	}
}

int main()
{
	int m;
	while(scanf("%d%d",&n,&m)!=EOF){
		for(int i=0;i<n;i++)
		for(int j=0;j<n;j++){
			if(i==j)
				dp[i][j]=0;
			else
				dp[i][j]=INF;
		}
		for(int i=0;i<m;i++){
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			if(dp[a][b]>c)
				dp[a][b]=dp[b][a]=c;
		}
		fly(); int s;int e;
		scanf("%d%d",&s,&e);
		if(dp[s][e]==INF)
			printf("-1
");
		else
			printf("%d
",dp[s][e]);

	}
	return 0;
}

Djs+优先队列+邻接表

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
const int INF=0xfffffff;
struct edge
{
	int val;int next;int to;
}e[1111111];

int len;int head[111111];

void add(int from ,int to,int val)
{
	e[len].to=to;
	e[len].val=val;
	e[len].next=head[from];
	head[from]=len++;
}

struct Node
{
	int x;int dist;
};

struct cmp
{
	bool operator() (const Node &a,const Node & b)
	{
		return a.dist>b.dist;
	}
};

int n;
int dis[1000];
int vis[1000];
void djs(int x)
{
	for(int i=0;i<n;i++)
		dis[i]=INF;
	memset(vis,0,sizeof(vis));
	dis[x]=0;
	Node k;k.x=x;k.dist=0;
	priority_queue<Node,vector<Node>,cmp> q;
	q.push(k);
	while(!q.empty()){
		int cur=q.top().x;
		q.pop();
		if(vis[cur]) continue;
		vis[cur]=1;
		for(int i=head[cur];i!=-1;i=e[i].next){
			int cc=e[i].to;
			if(!vis[cc]&&dis[cur]+e[i].val<dis[cc]){
				dis[cc]=dis[cur]+e[i].val;
				Node k;k.x=cc;k.dist=dis[cc];
				q.push(k);
			}
		}
	}
}
int main()
{
	int m,a,b,c,e,s;
	while(scanf("%d%d",&n,&m)!=EOF){
		len=0;memset(head,-1,sizeof(head));
		for(int i=0;i<m;i++){
			scanf("%d%d%d",&a,&b,&c);
			add(a,b,c);
			add(b,a,c);
		}
		scanf("%d%d",&s,&e);
		djs(s);
		if(dis[e]==INF){
			printf("-1
");
		}
		else
			printf("%d
",dis[e]);
	}
	return 0;
}

spfa+邻接表

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
const int INF=0xffffff;
struct edge
{
	int val;int next;int to;
}e[111111];

int len;int head[10000];
void add(int from,int to,int val)
{
	e[len].to=to;
	e[len].val=val;
	e[len].next=head[from];
	head[from]=len++;
}
int dis[111111];
int vis[111111];
int n;
void spfa(int x)
{
	for(int i=0;i<n;i++)
		dis[i]=INF;
	memset(vis,0,sizeof(vis));
	dis[x]=0;vis[x]=1;
	queue<int> q;
	q.push(x);
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		vis[cur]=0;
		for(int i=head[cur];i!=-1;i=e[i].next){
			int cc=e[i].to;
			if(dis[cc]>dis[cur]+e[i].val){
				dis[cc]=dis[cur]+e[i].val;
				if(!vis[cc]){
					vis[cc]=1;
					q.push(cc);
				}
			}
		}
	}
}

int main()
{
	int m,a,b,c,s,e;
	while(scanf("%d%d",&n,&m)!=EOF){
		len=0;memset(head,-1,sizeof(head));
		for(int i=0;i<m;i++){
			scanf("%d%d%d",&a,&b,&c);
			add(a,b,c);
			add(b,a,c);
		}
		scanf("%d%d",&s,&e);
		spfa(s);
		if(dis[e]==INF)
			printf("-1
");
		else
			printf("%d
",dis[e]);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/yigexigua/p/3759174.html