1. 程式人生 > >HDU 2544 最短路

HDU 2544 最短路

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 42854    Accepted Submission(s): 18789


Problem Description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?


Input 輸入包括多組資料。每組資料第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號為1的路口是商店所在地,標號為N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,我們的工作人員需要C分鐘的時間走過這條路。
輸入保證至少存在1條商店到賽場的路線。

Output 對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間
Sample Input 2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output 3 2
Source 思路:           這道題是一道裸的迪杰特斯拉演算法,剛學會,第一次寫!在這裡寫一下迪杰特斯拉演算法的總結吧:           迪杰特斯拉演算法不能有負的權值的路,必須已知起點和終點,並且給你了許多對點的距離,讓你求起點到終點的距離!           簡單的總結一下prim演算法和迪杰特斯拉演算法之間的區別:           prim演算法是已知很多對點之間的距離,讓你求將所有的點連線起來的最短的路的長度!prim演算法不需要知道起點和終點,它的目的是讓求將所有的點連起來的最短的路, 而迪傑斯特拉演算法是求兩個給定的點之間的最短的距離!prim演算法最終生成的是一顆最小生成樹,而迪杰特斯拉演算法最終生成的只是這棵樹的一個樹枝;他們在程式碼方面就只 有在資料更新的時候有所不同,在資料更新的時候prim演算法是更新到集合裡面任意一點的距離最短的距離就是他目前的距離,而迪傑斯特拉演算法是每次都更新到源點(起點) 的距離的最小的值,大致我知道的區別就這麼多,等下次深入學後再詳細總結吧! 程式碼:
//這一次是第一次用map函式,感覺map函式好強大! 
#include <stdio.h>
#include <string.h>
#include<iostream>//這個函式名也必須有   
#include <map>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int d[155][155];
int dis[155];
int vis[155];
int m;
char x[35],y[35];
int t;
map<string,int>mp;//因為在main函式裡面還要用到這個容器,所以要定義在函式外面 
void init()
{
	mp.clear();//在這裡面清零就行了(將所有的元素刪除就OK了!) 
	getchar();//要注意字元型前面要加上getchar(); 
	scanf("%s%s",x,y);
	mp[x]=1;//下表從1開始! 
	t=2;
	while(!mp[y])//剛開始沒有考慮起點和終點重合,一定要記住有可能重合 
	{
		mp[y]=t++;//所以這一點本能寫成mp[y]=2 ;
	}
	memset(d,INF,sizeof(d));
	memset(vis,0,sizeof(vis));
	
	char a[35],b[35];
	int c;
	for(int i=1;i<=m;i++)
	{
		getchar();
		scanf("%s%s%d",a,b,&c);
		if(!mp[a])//當與前面的字串不相同的時候,要將字串進行編號 
		{
			mp[a]=t++;//否則就不用編號就行了! 
		}
		if(!mp[b])
		{
			mp[b]=t++;
		}
		if(d[mp[a]][mp[b]]>c)//字串進行過編號之後,就可以像一般的數字一樣進行操作了! 
		{
			d[mp[b]][mp[a]]=d[mp[a]][mp[b]]=c;
		}
	}
	for(int i=1;i<t;i++)
	{
		dis[i]=d[1][i];
	}
	dis[1]=0;
	vis[1]=1;
}
void dijkstra()
{
	int min,k;
	for(int i=1;i<t;i++)
	{
		min=INF;
		for(int j=1;j<t;j++)
		{
			if(!vis[j]&&dis[j]<min)
			{
				min=dis[j];
				k=j;
			}
		}
		if(min==INF)
			break;
		vis[k]=1;
		for(int j=1;j<t;j++)
		{
			if(!vis[j]&&dis[j]>dis[k]+d[k][j])
			{
				dis[j]=dis[k]+d[k][j];
			}
		}
	}
}
int main()
{
	while(scanf("%d",&m)&&(m!=-1))
	{
		init();
		dijkstra();
		if(dis[mp[y]]==INF)//剛開始沒有考慮起點和終點重合,一定要記住有可能重合 
			printf("-1\n");
		else
			printf("%d\n",dis[mp[y]]);
	} 
	return 0;
}

相關推薦

hdu 2544 短路(SPFA算法)

oid rom 表示 max 兩個 amp 取消 get pid 本題鏈接:點擊打開鏈接 本題大意: 首先輸入一個n,m。代表有n個點。m條邊。然後輸入m條邊,每條邊輸入兩個點及邊權。1為起點,n為終點。輸入兩個零表示結束。 解題思路:

HDU 2544 - 短路 - [堆優化dijkstra][短路模板題]

堆優化 push_back empty ace tle continue back 整數 所有 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Time Limit: 5000/1000 MS (Java/Others

hdu-2544 短路

mes 整數 成都 所在地 最短 最短路 mem cos pre Time limit1000 ms Memory limit32768 kB 在每年的校賽裏,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時

HDU-2544-短路

%d -o string nlogn flag iostream cst using def 迪傑斯特拉算法--O(nlogn) #include"iostream" #include"cstring" #include"cstdio" using namespace

短路徑(Dijkstra)-HDU 2544-短路

最短路徑(Dijkstra)-HDU 2544-最短路 題目連結: 最短路 題目基礎: 最短路徑-Dijkstra(迪傑斯特拉)演算法 思路: 題目大意: 略略略~~ 題解: 套模板,傳送門有詳解

HDU 2544 短路

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis

HDU 2544 短路(dijkstra演算法模板題)

  Problem Description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

兩道短路裸題(HDU 2544 短路 / HDU 1596 find the safest road)

題意:給出n個點,m條邊的圖,求1到n的 最短路。 程式碼: #include <stdio.h> #include <algorithm> #include <string.h> #include <vec

HDU 2544 短路【Dijkstra演算法堆優化,Vector建圖】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 55757    Accepted Submissi

HDU 2544 短路(dijkstra)

Problem Description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?   Input

hdu 2544 短路裸題 SPFA

#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <

HDU 2544 短路

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 42854    Accepted Submission

HDU 2544 短路短路 Floyd)

題目:http://acm.hdu.edu.cn/showproblem.php?pid=2544 程式碼: #include<stdio.h> #include<string.h> #include<algorithm> using

HDU 2544 短路短路/spfa)

題目:http://acm.hdu.edu.cn/showproblem.php?pid=2544 程式碼: #include <stdio.h> #include <queue> using namespace std; #define RANG

hdu oj 2544 短路(短路徑)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31874    Accepted Submissio

hdu-5889-短路+網絡流/小割

mpi test 轉化 無向圖 align fine clear priority targe Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth

hdu 2554 短路 (dijkstra)

sam ret int hdu cst esp dijkstra tdi total 最短路Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su

Mr. Panda and Crystal HDU - 6007 短路+完全背包

tor 需要 不難 return ems als 最短路 using vol 題目:題目鏈接 思路:不難看出,合成每個寶石需要消耗一定的魔力值,每個寶石有一定的收益,所以只要我們知道每個寶石合成的最小花費,該題就可以轉化為一個背包容量為初始魔力值的完全背包問題,每個寶石的

hdu-3790短路刷題

title: hdu-3790最短路刷題 date: 2018-10-20 14:50:31 tags: acm 刷題 categories: ACM-最短路 概述 一道最短路的水題,,,儘量不看以前的程式碼打出來,,,熟悉一下dijkstra的格式和鏈式前向星的寫法,,,, 雖

Ideal Path,uva1599/hdu 3760(短路中字典序小的路徑)

https://vjudge.net/problem/UVA-1599 給一個n個點m條邊(2<=n<=100000,1<=m<=200000)的無向圖,每條邊上都塗有一種顏色。求從結點1到結點n的一條路徑,使得經過的邊數儘量少,在此前提下,經過邊的顏色序列的字典序最小。