最短路径问题--比较综合的一道题

本文针对杭电ACM-3790的最短路径问题进行了详细解析,并分享了一个典型的实现案例。通过调试过程中的问题解决,总结出了有效的代码实现方法。

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

复习最短路径问题,发现杭电acm-3790这道题目比较典型,就练习了下。开始调试时一直报错,后来加了87-91行,竟然就accepted,可能还是题意没完全理解清楚吧。特地记录下来,代码如下:
#include 
#define MAX 1001
#define INF 65535

typedef struct cost
{
	int d;//距离
	int p;//花费
}cost;
cost map[MAX][MAX];

void calculate(cost map[MAX][MAX],cost D[MAX],int P[MAX],int flag[MAX],int n,int s)
{
	for(int i=1;iD[j].p)
					{
						continue;
					}
				}
				D[j].d=min.d+map[k][j].d;
				D[j].p=min.p+map[k][j].p;
				P[j]=k;
			}
		}
	}
}


int main()
{
	int n,m;	
	while(~scanf("%d%d",&n,&m))//输入n,m
	{
		if(n==0 && m==0)//退出
		{
			break;
		}
		int loop=m;

		for(int i=0;i<=n;i++)//初始化数组
		{
			for(int j=0;j<=n;j++)
			{
				if(i==j)
				{
					map[i][j].d=0;
					map[i][j].p=0;
					map[j][i]=map[i][j];
					continue;
				}
				map[i][j].d=INF;
				map[i][j].p=INF;
				map[j][i]=map[i][j];
			}
		}

		int a,b,d,p,s,t;
		while(loop--)
		{
			scanf("%d%d%d%d",&a,&b,&d,&p);
			if(map[a][b].d>d)
			{
				map[a][b].d=d;
				map[a][b].p=p;
				map[b][a]=map[a][b];
			}
			else if(map[a][b].d==d)
			{
				if(map[a][b].p>p)
					map[a][b].p=map[b][a].p=p;
			}		
		}
		scanf("%d%d",&s,&t);
		int P[MAX],flag[MAX];//P-前一路径
		cost D[MAX];//D-最小值
		for(int i=0;i<=n;i++)
		{
			D[i].d=map[s][i].d;
			D[i].p=map[s][i].p;
		}
		for(int i=0;i<=n;i++)
		{
			P[i]=s;
		}
		for(int i=0;i<=n;i++)
		{
			flag[i]=0;
		}
		flag[s]=1;

		calculate(map,D,P,flag,n,s);
		printf("%d %d\n",D[t].d,D[t].p);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值