hdu 2066 最短路径Dijkstra算法

本文介绍了一种使用迪杰斯特拉算法求解最小生成树的问题解决方法,详细解释了算法步骤并提供了相应的代码实现。

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

#include <iostream>
#include <cstdio>
const int N=10000;
using namespace std;
int a[1005][1005],b[1005],bz[1005],lj[1005],xq[1005],ma;

int djik(int s)
{
	int i,j,k,mi;
	for(i=1;i<=ma;i++)
    {
 	  b[i]=a[s][i]; bz[i]=0;
    }
    bz[s]=1; b[s]=0;
    for(i=1;i<ma;i++)
    {
    	for(mi=N,k=j=1;j<=ma;j++)
    	  if(bz[j]==0&&b[j]<mi) mi=b[j],k=j;
  	  bz[k]=1;
  	  for(j=1;j<=ma;j++)
  	   if(bz[j]==0&&a[k][j]<N)
  	   {
   	  	  int d=b[k]+a[k][j];
   	  	  if(d<b[j]) b[j]=d;
   	   }  
    }
}

int main()
{
	int m,m1,i,j,c,cc,x,y,d,n;
	while(cin>>n>>m>>m1)
	{   memset(a,1,sizeof(a));
		for(ma=1,i=1;i<=n;i++)
		{scanf("%d%d%d",&x,&y,&d);
		 if(d<a[x][y]) a[x][y]=a[y][x]=d; //陷阱二:重边问题
		 if(x>ma) ma=x;  //陷阱一:n不是最大的顶点
		 if(y>ma) ma=y;
		}
		for(i=1;i<=m;i++)
		 scanf("%d",&lj[i]);
	    for(i=1;i<=m1;i++)
	     scanf("%d",&xq[i]);
        for(cc=N,i=1;i<=m;i++)
        {  
         djik(lj[i]);
		  for(j=1;j<=m1;j++)
		  if(bz[xq[j]]&&b[xq[j]]<cc)  cc=b[xq[j]];
	    }
        printf("%d\n",cc);       
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值