POJ - 2387 Til the Cows Come Home (最短路)

题目链接-Til the Cows Come Home


思路:一看就是dijkstra来着,但是还是出现了不少错误。

1.memset函数使用时要包含头文件cstring

2.menset函数按位替换,所以直接memset个max是不行的。

3.

//for(int k =1;(!collected[k])&&k<=N;k++)
        for(int k =1;k<=N;k++)
		if((!collected[k])&&dist[k]<min)
以上这一小段代码,要注意不能采用注释掉的那一种,逻辑不正确,举例:每次从第一个开始遍历,而第一个一定是被collected,直接弹出。事实上这句话需要的逻辑是,遇到收集过的直接跳过,而不是直接弹出,不再循环了。

4.

if (distance < graph[a][b]) graph[a][b]=graph[b][a]=distance;

在读入的时候一定要注意加上这个if判断,因为有可能有重路,取小的那个。


以下是完整代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAX 9999999
using namespace std;
typedef int vertax;

int graph[1005][1005];
int dist[1005];
bool collected[1005];

void dijkstra(int N)
{
	vertax v = 0;
	int min = MAX;
	dist[1] = 0;
	for(int j=1;j<=N;j++)
	{
		min = MAX;
		//for(int k =1;(!collected[k])&&k<=N;k++)
		for(int k =1;k<=N;k++)
		{
			if((!collected[k])&&dist[k]<min)
			{
				min = dist[k];
				v = k;
								
			}
		}

		collected[v]=true;
		for(int m = 1;m<=N;m++)
		{
			if((dist[v]+graph[v][m]<dist[m]))
			{
				dist[m] = dist[v]+graph[v][m];
			}
		}
	}
};
int main(void)
{
	vertax a,b,N;
	int T,distance;
	cin>>T>>N;
	memset(graph,12,sizeof(graph));	
	memset(dist,12,sizeof(dist));
	memset(collected,false,sizeof(collected));	
	for(int j =0;j<T;j++)
	{
		//create graph
		cin>>a>>b>>distance;
		if (distance < graph[a][b]) graph[a][b]=graph[b][a]=distance;
	}
	//dijkstra
	dijkstra(N);
	//output
	cout<<dist[N]<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值