1. 程式人生 > >洛谷P2299 Mzc和體委的爭奪戰 題解

洛谷P2299 Mzc和體委的爭奪戰 題解

題目

題目描述

mzc家很有錢(開玩笑),他家有n個男家丁(做過前三彈的都知道)。但如此之多的男家丁吸引來了我們的體委(矮胖小夥),他要來與mzc爭奪男家丁。

mzc很生氣,決定與其決鬥,但cat的體力確實有些不穩定,所以他需要你來幫他計算一下最短需要的時間。

輸入輸出格式

輸入格式:

第一行有兩個數n,m.n表示有n個停留站,m表示共有m條路。

之後m行,每行三個數 a i

a_i b i b_i c i
c_i
​,表示第 a i a_i 個停留站到第 b i
b_i
​個停留站需要 c i c_i 的時間。(無向)

輸出格式:

一行,輸出1到n最短時間。

分析:

我不得不說,看了一大堆題目還以為是什麼高深演算法結果只是比模板題還模板的單源最短路。。。

切入正題,這道題看出是單源最短路後就可以用dijkstra或者spfa來解出了,考慮到沒有負邊權,可以用最簡單也最省時的dijkstra來寫(spfa我怕被卡,其實主要是dijkstra寫熟了。。。)。下面就看程式碼。

程式碼

#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct edge
{
	int to,val;
};
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
vector<edge>e[2505];
int dis[2505];
int vis[2505];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y,z; 
		scanf("%d%d%d",&x,&y,&z);
		edge tmp;
		tmp.to=y;
		tmp.val=z;
		e[x].push_back(tmp);
		tmp.to=x;
		tmp.val=z;
		e[y].push_back(tmp);//只要這個地方主要是雙向邊,其他就是完完全全的模板,基本上沒有什麼問題
	} 
	for(int i=1;i<=n;i++)
	{
		dis[i]=2147483647;
	}
	dis[1]=0;
	q.push(make_pair(0,1));
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		if(vis[x]==1)
		continue;
		vis[x]=1;
		for(int i=0;i<e[x].size();i++)
		{
			int y=e[x][i].to;
			if(dis[x]+e[x][i].val<dis[y])
			{
				dis[y]=dis[x]+e[x][i].val;
				q.push(make_pair(dis[y],y));
			}
		}
	}
	printf("%d\n",dis[n]);
	return 0;
}

值得一看的標準模板。