最短路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\n");

		else

			printf("%d\n",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\n");

		}

		else

			printf("%d\n",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\n");

		else

			printf("%d\n",dis[e]);

	}

	return 0;

}

  

你可能感兴趣的:(HDU)