HDUOJ_3665(Seaside)(dijkstra)
Seaside
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1369 Accepted Submission(s): 984
Problem 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
Source
提示:该题求最短路径,难点是对输入的样例的理解和如何把输入的数据正确存入相应的变量中。
题意:有n个城镇,从0到n-1编号,小杨在0号城镇,该城镇不靠近海边,小杨想去海边。所给的城镇中有的靠近海边,有的不靠近海边。靠近海边的城镇用1标记,不靠近海边的城镇用0标记。问小杨到海边的最短距离。给出的样例数据包括:每个城镇连通的道路条数,以及城镇是否靠近海边,以及相连两个城镇之间的道路的长度。
5 /*有5个城镇,接下来有5组测试数据,依次是从0到n-1号的城镇相对应的数据*/
1 0 /*1表示与0号城镇连通的有1条路,0表示0号城镇不靠近海边*/
1 1 /*第一个1表示1号城镇,第二个1表示0号城镇与1号城镇之间的道路长度为1*/
2 0 /*2表示有两条道路与1号城镇相连,0表示该城镇不靠近海边*/
2 3 /*2表示2号城镇,3表示1号城镇与2号城镇之间的道路长度为3*/
3 1 /*3表示3号城镇,1表示1号城镇与3号城镇之间的道路长度为1*/
1 1 /*第一个1表示与2号城镇相连的道路有1条,第二个1表示2号城镇靠近海边*/
4 100 /*4表示4号城镇,100表示4号城镇与2号城镇的距离为100*/
0 1 /*0表示与3号城镇连接的道路有0条,1表示3号城镇靠近海边*/
0 1 /*0表示与4号城镇相连的道路有0条,1表示4号城镇靠近海边*/
My solution:
/*2015.8.22*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int map[20][20],d[20],mark[20],n;
void dijkstra(int s)
{
int v,i;
d[s]=0;
while(true)
{
v=-1;
for(i=0;i<n;i++)
if(!mark[i]&&(v==-1||d[i]<d[v]))
v=i;
if(v==-1)
break;
mark[v]=1;
for(i=0;i<n;i++)
d[i]=min(d[i],d[v]+map[v][i]);
}
}
int main()
{
int i,j,k,m,m1,t[20],a,min=INF,h;
while(scanf("%d",&n)==1)
{
if(n==0)/*当n为0时,重新输入下一组数据*/
continue;
h=-1;
memset(mark,0,sizeof(mark));
memset(map,0x3f,sizeof(map));
memset(d,0x3f,sizeof(d));
for(i=0;i<n;i++)/*i表示当前输入i号城镇相应的数据*/
{
scanf("%d%d",&m,&m1);
if(m1==1)
t[++h]=i;/*存放靠近海边的城镇的编号(存放多个终点)*/
for(j=0;j<m;j++)/*m表示与i号城镇相连的道路数目*/
{
scanf("%d%d",&a,&k);/*a表示与i号城镇相连的城镇,K表示这两个城镇之间的道路长度*/
if(map[i][a]>k)/*防止重边*/
{
map[i][a]=k;/*无向图,双向赋值*/
map[a][i]=k;
}
}
}
// for(i=0;i<n;i++)/*检验数据是否正确放入map数组中*/
// {
// for(j=0;j<n;j++)
// printf("%d ",map[i][j]);
// printf("\n");
// }
dijkstra(0);
for(i=0;i<=h;i++)
{
if(d[t[i]]<min)
min=d[t[i]];
}
printf("%d\n",min);
}
return 0;
}