HDU 1874 畅通工程续

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

第一次floyd算法,求最短路

#include<stdio.h>
#include<iostream>
using namespace std;
const int M=1<<29;
int map[201][201];
int n,m;
void floyd()
{
	int k,i,j;
	for(k=0;k<n;k++)
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				 map[i][j] = min(map[i][k] + map[k][j], map[i][j]);
}
int main()
{
	int a,b,c,p,q,i,j;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=0;i<n;i++)
		  for(j=0;j<n;j++)
			  map[i][j]=i==j?0:M;
		while(m--)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(c<map[a][b]) 
			    map[a][b]=map[b][a]=c;
		}
		scanf("%d%d",&p,&q);
		floyd();
		printf("%d\n",(map[p][q]<M)?map[p][q]:-1);
	}
	return 0;
}

再来个dijstra的

#include<stdio.h>
#include<string.h>
#define MAX 1<<28
int map[205][205];
int n,m;
int dijstra(int beg,int end)
{
	bool flag[205];
	int path[205];
	int i,min,x;
	for(i=0;i<n;i++)
	{
		path[i]=MAX;
		flag[i]=true;
	}
	path[beg]=0;
	flag[beg]=false;
	x=n-1;
	while(x--)
	{
		for(i=0;i<n;i++)
		{
			if(map[beg][i]&&path[i]>path[beg]+map[beg][i])
				path[i]=path[beg]+map[beg][i];
		}
		min=MAX;
		for(i=0;i<n;i++)
		{
			if(flag[i]&&min>path[i])
			{
				min=path[i];
				beg=i;
			}
			
		}
		flag[beg]=false;
	}
	path[end]=path[end]<MAX?path[end]:-1;
	return path[end];
}
int main()
{
	int a,b,c,beg,end;
	while(~scanf("%d%d",&n,&m))
	{
		memset(map,0,sizeof(map));
		while(m--)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(map[a][b])
				map[a][b]=map[b][a]=c<map[a][b]?c:map[a][b];
			else
				map[a][b]=map[b][a]=c;
		}
		scanf("%d%d",&beg,&end);
		printf("%d\n",dijstra(beg,end));
	}
	return 0;
}

再贴上一个SPFA的,刚开始学习尽量每道题用多种算法都写一变,这样记得更牢

#include<stdio.h>
#include<vector>
#include<queue>
#define MAX 205
#define INF 1<<28
using namespace std;
int n,m;
struct node
{
	int v,w;
};
vector<node> g[MAX];
queue<int> q;
int spfa(int beg,int end)
{
	int i,path[MAX];
	bool flag[MAX];
	for(i=0;i<n;i++)
	{
		path[i]=INF;
		flag[i]=0;
	}
	path[beg]=0;
	flag[beg]=1;
	q.push(beg);
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		flag[k]=0;
		for(i=0;i<g[k].size();i++)
		{
			int v=g[k][i].v;
			int w=g[k][i].w;
			if(path[v]>path[k]+w)
			{
				path[v]=path[k]+w;
			    if(!flag[v])
			    {
				 flag[v]=1;
				 q.push(v);
			    }
			}
		}
	}
return path[end]<INF?path[end]:-1;
}
int main()
{
	int a,b,c,i;
	int beg,end;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=0;i<n;i++)
			g[i].clear();
		while(m--)
		{
			scanf("%d%d%d",&a,&b,&c);
			node t;
			t.v=a;
			t.w=c;
			g[b].push_back(t);
			t.v=b;
			g[a].push_back(t);
		}
		scanf("%d%d",&beg,&end);
		printf("%d\n",spfa(beg,end));
	}
	return 0;
}




 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值