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());
}

 

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