HDUOJ_3665(Seaside)(dijkstra)
2015-08-24 00:47
295 查看
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
[align=left]Problem Description[/align]
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 SMi and LMi, which means that
the distance between the i-th town and the SMi town is LMi.
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
2010 Asia Regional Harbin
提示:该题求最短路径,难点是对输入的样例的理解和如何把输入的数据正确存入相应的变量中。
题意:有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; }
相关文章推荐
- 【C语言】预处理指令—条件编译
- 解题报告 之 HDU5319 Painter
- JavaHttpGet中文内容编码为GBK时注意
- MySQL安装方法
- 解题报告 之 2015蓝桥杯 垒骰子
- C++: 安装minGW,Msys;对接NeatBeans IDE
- 编写高质量代码改善C#程序的157个建议——建议147:重构多个相关属性为一个类
- [HDU 5410]CRB and His Birthday[01、完全背包]
- POJ1236 - Network of Schools tarjan
- 解题报告 之 HDU5323 Solve this interesting problem
- Leetcode解题笔记-Combination Sum
- 笔记一下动态MST离线的分治做法
- Hbuilder开发app实战-识岁05-Crypto.js实现各种js加密算法
- 实现一个事务多个dao情况下,使用同一个connection,保证线程安全
- 题目:两个整数相除
- Hadoop(最新版ChainMapper链接MapReduce作业带原理分析)
- Maven学习笔记之How do I filter resource files
- C++正则表达式
- 题目:丢失的第一个正整数
- 【Dijkstra+邻接表求次短路】POJ Sightseeing 3463