POJ 2387.Til the Cows Come Home

北京大学暑期课程期末考试G题,(Orz太菜了10多个题就弄了三个,这个题感觉被阴了,但还是英文太差的锅)

最短路,Dijkstra的模板题

想说说现场赛(这个是假的)的感受,考前以为老师到时候给的PPT会有这个算法的代码版没想到只有中文简化形容版,本来四个小时的考试因为交换机的故障也缩短成了两个半小时,到这道题开始看的时候就有点着急犯蠢了(printf的时候想print dijkstra函数 没想到忘加括号了 - -,最蠢的是考后看了群里讨论才知道这个题输入有坑,输入有可能出现重边情况,要进行判重,存储边值更小的,对英文不好的人实在太不友善了,还是应该自习读一读题啊

不过dijkstra模板对着中文概述还是写对了,自己也挺高兴的~

题目链接

//g dijkstra
#include <iostream>
#include <cstring>
#define INF 999999
using namespace std;
int map[2005][2005]; 
int d[2005];//表示这个点到1的距离 
int mark[2005];
int t,n;
int dijkstra()//最终可能要return dt 
{
	while(1)
	{	 
		int minv = INF;
		int minindex = INF;
		for(int i=1;i<=t;i++)
		{
			if(mark[i]==1)
			{
				continue;
			}
			if(d[i]<minv)
			{
				minv = d[i];
				minindex = i;
			}
		}
		if(minindex==INF)
		{
			return d[t];
		}
		int u = minindex;
		mark[u] = 1;
		for(int v=1;v<=t;v++)
		{
			if(mark[v]!=1&&map[u][v]!=0)
			{
				d[v] = min(d[v],d[u]+map[u][v]);
			}
		}
	}
}
int main(void)
{
	for(int i=0;i<2005;i++)
	{
		d[i] = INF;//初始化所有的距离为无穷  
	} 
	memset(map,0,sizeof(map));
	memset(mark,0,sizeof(mark));
	scanf("%d%d",&n,&t);//从1到t的距离最小 
	for(int i=0;i<n;i++) 
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		if(map[a][b]==0)
		{ 
			map[a][b] = c;
			map[b][a] = c; 
		}
		else
		{
			if(c<map[a][b])
			{
				map[a][b] = c;
				map[b][a] = c;
			}
		}
	}
	d[1] = 0;
	printf("%d\n",dijkstra());
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章