HDU3665Seaside(最短路徑)

Zhac發表於2016-08-04
Description
XiaoY is living in a big city, there are N towns in it and some towns near the sea. All these towns are numbered from 0 to N-1 and XiaoY lives in the town numbered ’0’. There are some directed roads connecting them. It is guaranteed that you can reach any town from the town numbered ’0’, but not all towns connect to each other by roads directly, and there is no ring in this city. One day, XiaoY want to go to the seaside, he asks you to help him find out the shortest way.
Input
There are several test cases. In each cases the first line contains an integer N (0<=N<=10), indicating the number of the towns. Then followed N blocks of data, in block-i there are two integers, Mi (0<=Mi<=N-1) and Pi, then Mi lines followed. Mi means there are Mi roads beginning with the i-th town. Pi indicates whether the i-th town is near to the sea, Pi=0 means No, Pi=1 means Yes. In next Mi lines, each line contains two integers S Mi and L Mi, which means that the distance between the i-th town and the S Mi town is L Mi.
Output
Each case takes one line, print the shortest length that XiaoY reach seaside.
Sample Input
5
1 0
1 1
2 0
2 3
3 1
1 1
4 100
0 1
0 1
Sample Output

2

題意:這道題輸入的比較麻煩。第一行n代表有n個城市(標號0~n),然後有n行資料,這n行資料每行有兩個數m,p,m代表i城市有m條路,p表示第i個城市是否連線海邊,如果是0不連線,是1就連線海邊。每個m,p,後接有m行資料,每行資料有兩個字母s,l,s代表這條路連線的城市,l代表這條路的距離。最後問小y到海邊的最短距離

思路:最短路,就是輸入的方式變得麻煩了,實質還是沒有變,輸入的是否判斷該城市是否連線海邊,如果連線先儲存在一個陣列裡,然後對每條路更新最短距離就好了。最後floyd演算法做,調出儲存的連線海邊城市,搜尋0~這個城市的距離,找到最小距離就好了。注意小y老家在0城市!

程式碼:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std; 
#define INF 0xfffffff
int pri[1010][1010];//兩個頂點之間距離
int w[1010];
int n,m;
void floyd()
{
	for(int k=0;k<n;k++)//中間點 
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				pri[i][j]=min(pri[i][j],abs(pri[i][k]+pri[k][j]));
			 }
		 }
	 }
} 
int main()
 {
 	while(scanf("%d",&n)!=EOF)
 	{
 		 int k=0;
 		 int ans=INF;
 		 for(int i=0;i<n;i++)
		 for(int j=0;j<n;j++)
		 pri[i][j]=i==j?0:INF;
		 for(int i=0;i<n;i++)
		 {
		 	int m,y;
		 	scanf("%d%d",&m,&y);
		 	if(y==1)
		 	w[k++]=i;
		 	for(int j=0;j<m;j++)
		 	{
		 		int a,b;
		 		scanf("%d%d",&a,&b);
		 		if(pri[i][a]>b)
		 		pri[i][a]=b;
			 }
		 }
		 floyd();
		 for(int i=0;i<k;i++)
		 {
		 	if(pri[0][w[i]]<ans)
		 	ans=pri[0][w[i]];
		 }
		 printf("%d\n",ans);
	}
 	return 0;
 }


相關文章