hdu 1874 畅通工程续

本文详细介绍了如何使用Prim算法解决最小生成树问题,包括初始化图、输入边权重、选择最小权重点并更新距离的过程,最后输出从起点到终点的最小路径权值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题链接:点击打开链接

本题大意:

        有n个村庄m条路,输入每条路连接的村庄标号及权值,然后给出起点和终点,求其最小生成树的权值,若不能生成一棵树,则输出-1。

解题思路:

        使用的是Prime算法,用所给的道路连接的村庄号作为下标,道路长度作为权值构建一个图,由所给起点开始依次查找距当前起点权值最小的点将其连上,更新未连点到所连图的权值,再次查找。具体请参见代码:

#include<stdio.h>
#include<string.h>
#define INF 0xffffff
int map[210][210];
int mark[220],lowcost[220];
int main()
{
	int n,m,x,y,cost,s,e,vir;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				map[i][j]=INF;//将图初始化为无穷大 
		for(int k=0;k<m;k++)
		{
			scanf("%d%d%d",&x,&y,&cost);
			if(map[x][y]>cost)//将每条路对应的编号及长度存到图中 
				map[x][y]=map[y][x]=cost;//由于来与往路的长度是相等的 
		}
		scanf("%d%d",&s,&e);
		memset(mark,0,sizeof(mark));//初始化标记数组 
		for(int i=0;i<n;i++)
		{
			lowcost[i]=map[s][i];//loecost数组中现在存放的是以s为起点到其余点的权值 
		}			
		lowcost[s]=0;
		mark[s]=1;//将起始点权值变为0,并标记起始点 
		for(int k=1;k<n;k++)//有n个点,故需查找n-1次 
		{
			int min=INF;
			for(int i=0;i<n;i++)//每次均遍历所有点 
			{
				if(!mark[i]&&lowcost[i]<min)//查找到距起始点权值最小的点 
				{
					min=lowcost[i];
					vir=i;//取出其坐标作为新的起点 
				}	
			}
			if(min==INF)
				break;
			mark[vir]=1;//将查找到的点标记 
//			lowcost[vir]=0;
			for(int j=0;j<n;j++)//更新各点的权值 
//				if(!mark[j]&&map[vir][j]<lowcost[j])
//				{
//					lowcost[j]=map[vir][j];
//					mark[j]=vir;
//				}	
				if(!mark[j]&&lowcost[j]>lowcost[vir]+map[vir][j])
					lowcost[j]=lowcost[vir]+map[vir][j];
		}			
		if(lowcost[e]==INF)
			printf("-1\n");
		else
			printf("%d\n",lowcost[e]);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值