`

杭电 hdu 2066 一个人的旅行

阅读更多
第二次

/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
	Copyright (c) 2011 panyanyany All rights reserved.

	URL   : http://acm.hdu.edu.cn/showproblem.php?pid=2066
	Name  : 2066 一个人的旅行

	Date  : Friday, August 19, 2011
	Time Stage : half an hour

	Result:
4453342	2011-08-19 20:45:07	Accepted	2066
31MS	4200K	2070 B
C++	pyy


	Test Data:


	Review:
一开始忘记注释掉 freopen 函数了,结果悲剧地wrong answer
//----------------------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))

#define infinity    0x7f7f7f7f
#define minus_inf    0x80808080

#define MAXSIZE 1009

int road, neigh, dest, cityNum, minTime ;
int map[MAXSIZE][MAXSIZE], dp[MAXSIZE], used[MAXSIZE], want[MAXSIZE] ;

void dijkstra ()
{
	int i, j ;
	int minPath, iminPath ;
	memset (used, 0, sizeof (used)) ;
//	memset (dp, infinity, sizeof (dp)) ;

	for (i = 1 ; i <= cityNum ; ++i)
		dp[i] = map[0][i] ;

	for (i = 1 ; i <= cityNum ; ++i)
	{
		minPath = infinity ;
		iminPath = 0 ;		// 这里不用也行,下面会给它赋值的
		for (j = 1 ; j <= cityNum ; ++j)
		{
			if (!used[j] && dp[j] < minPath)
			{
				iminPath = j ;
				minPath	 = dp[j] ;
			}
		}
		used[iminPath] = 1 ;
		for (j = 1 ; j <= cityNum ; ++j)
		{
			if (!used[j] && dp[iminPath] + map[iminPath][j] < dp[j])
				dp[j] = dp[iminPath] + map[iminPath][j] ;
		}
	}

	minTime = dp[want[1]] ;
	for (i = 2 ; i <= dest ; ++i)
		minTime = min (minTime, dp[want[i]]) ;
}

int main ()
{
//	freopen ("C:\\in.txt", "r", stdin) ;
	int i, j ;
	int a, b, c ;
	while (scanf ("%d%d%d", &road, &neigh, &dest) != EOF)
	{
		memset (map, infinity, sizeof (map)) ;
		cityNum = 0 ;
		for (i = 1 ; i <= road ; ++i)
		{
			scanf ("%d%d%d", &a, &b, &c) ;
			map[a][b] = map[b][a] = min (map[a][b], c) ;
			cityNum = max (cityNum, max (a, b)) ;
		}
		for (i = 1 ; i <= neigh ; ++i)
		{
			scanf ("%d", &a) ;
			map[0][a] = map[a][0] = 0 ;
		}
		for (i = 1 ; i <= dest ; ++i)
		{
			scanf ("%d", &want[i]) ;
		}
		dijkstra () ;

		printf ("%d\n", minTime) ;
	}
	return 0 ;
}



第一次

/* THE ROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//

        URL   :
        Name  :

        Date  : 2011/4/15 Friday
        Time Stage :

        Result:
        00638009 2011-04-15 01:54:52 Accepted 1001 31 MS 4208 KB Visual C++ pyy

Test Data:
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
//----------------------------------------------------------------------------*/
#include <iostream>
#include <string.h>
using namespace std;
const int infinite = 0x08080808, maxSize = 1002;
int roads, neighbors, want, cost, maxPoint, minTrip;
int dp[maxSize], map[maxSize][maxSize], wanted[maxSize], mark[maxSize];

void dynamicProgramming()
{
        int i, j, k, iminRoad = 0;
        int minRoad;
        memset( mark, 0, sizeof( mark ) );
        for( i = 1; i <= maxPoint; i++ )
                dp[i] = map[0][i];
        for( i = 1; i <= maxPoint; i++ )
        {
                minRoad = infinite;
                iminRoad = 0;
                // 找到所有到0 点的路径中最短的
                for( j = 1; j <= maxPoint; j++ )
                {
                        if( !mark[j] && dp[j] < minRoad )
                        {
                                iminRoad = j;
                                minRoad = dp[j];
                        }
                }
                mark[iminRoad] = 1;
                // 借助该最短路径,查找0 到其他点之间是否有最短路径
                for( j = 1; j <= maxPoint; j++ )
                {
                        if( !mark[j] && dp[iminRoad] + map[iminRoad][j] < dp[j] )
                        {
                                dp[j] = dp[iminRoad] + map[iminRoad][j];
                        }
                }
        }
        // 查找0 到wanted 里面所有元素的路径中的最短路径
        minTrip = dp[wanted[1]];
        for( i = 2; i <= wanted[0]; i++ )
                if( dp[wanted[i]] < minTrip )
                        minTrip = dp[wanted[i]];
}

int main()
{
        int i, j, k;
        while( cin >> roads >> neighbors >> want )
        {
                maxPoint = 0;
                memset( map, infinite, sizeof( map ) );
                for( i = 1; i <= roads; i++ )
                {
                        cin >> j >> k >> cost;
                        map[j][k] = map[k][j] = min( cost, map[k][j] );
                        maxPoint = max( maxPoint, max( j, k ) );
                }
                for( i = 1; i <= neighbors; i++ )
                {
                        cin >> j;
                        map[0][j] = map[j][0] = 0;
                }
                for( i = 1; i <= want; i++ )
                {
                        cin >> wanted[i];
                }
                wanted[0] = want;
                dynamicProgramming();
                cout << minTrip << endl;
        }
        return 0;
}


分享到:
评论

相关推荐

    杭电HDU ACM培训课件

    《杭电HDU ACM培训课件》是一份珍贵的学习资源,源自杭州电子科技大学的ACM竞赛培训课程。这些课件是官方论坛上分享的,旨在为那些积分不足无法获取资源或者对ACM编程竞赛感兴趣的初学者提供帮助。下面将详细阐述这...

    杭电HDU2050题的ac程序

    一个十分简单的程序,能够ac杭电hdu的第2050题,无注释,简单明了

    计算机网络复习大纲_杭电hdu.pdf

    计算机网络复习大纲_杭电hdu.pdf

    计算机网络复习大纲_杭电hdu整理.pdf

    计算机网络复习大纲_杭电hdu整理.pdf

    计算机网络复习大纲_杭电hdu参考.pdf

    计算机网络复习大纲_杭电hdu参考.pdf

    杭电HDU ACM 1005

    杭电ACM1005题源代码,AC了的程序,无问题……

    杭电操作系统实验 HDU操作系统实验.zip

    杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU...

    杭电ACMhdu1163

    【标签】:“杭电”代表题目来源于杭州电子科技大学,是ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest, ICPC)比赛的一个平台,提供了许多供学生练习和参赛的题目。"ACM"是此类竞赛的...

    HDU杭电 计算机网络实验报告

    - VLAN(虚拟局域网)是将一个物理网络划分为多个逻辑网络的方法,可以提高网络安全性,减少广播风暴,并优化流量管理。实验可能涉及了创建、删除VLAN,配置端口VLAN属性,以及设置VLAN间通信。 2. **生成树配置**...

    hdu_ACM.rar_ACM_hdu_hdu acm_hdu_ACM_杭电ACM

    杭电hdu acm资料所用杭电的acm题

    计算机网络复习大纲_杭电hdu借鉴.pdf

    每一层都有其特定的任务,例如物理层负责数据的物理传输,数据链路层处理相邻节点间的通信,网络层处理网络间的路由选择,运输层确保数据的可靠传输,而应用层则是用户直接交互的接口。 带宽是衡量网络传输能力的...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    杭电(HDU)ACM题解

    HDU2000至2099题的题目以及AC代码(含思路) 适合刚刚接触ACM的同学哦~ emmmm凑字

    acm课件搜索(杭电)(HDU)

    总的来说,"acm课件搜索(杭电)(HDU)"这一主题为ACM学习者提供了一个宝贵的资料库,特别是对搜索算法的探讨,有助于参赛者提升在竞赛中的表现。通过深入学习和实践,学生能够熟练掌握DFS和BFS,以及其他相关算法...

    HDU 杭电操作系统实验 (通过验收)

    包含实验内容:对应实验要求上的1/2/3/5实验,分别为setName/setNice,petree输出进程,模拟shell,进程通信,文件系统。包含全部实验源代码和详尽的word实验报告。同时包含在线PTA编程题目:进程模拟,模拟进程调度...

    HDU杭电ACM课件完整打包

    【标题】"HDU杭电ACM课件完整打包"是一个专门为ACM竞赛初学者准备的资源集合,其中包含了杭州电子科技大学(HDU)的ACM竞赛相关课程资料。这个压缩包提供了丰富的学习材料,旨在帮助新手快速入门并提升算法和编程...

    ACM HDU 2000-2099 解题报告 杭电 ACM

    2. **HDU Online Judge**:HDU OJ是杭州电子科技大学维护的一个在线编程竞赛平台,提供丰富的题目供参赛者练习和提交代码,支持多种编程语言,并有自动评分机制。 3. **解题策略**:报告中可能包含不同题目的解题...

Global site tag (gtag.js) - Google Analytics