浙大 pat 1003 题解
1003. Emergency (25)
As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible.
Input
Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (<= 500) - the number of cities (and the cities are numbered from 0 to N-1), M - the number of roads, C1 and C2 - the cities that you are currently in and that you must save, respectively. The next line contains N integers, where the i-th integer is the number of rescue teams in the i-th city. Then M lines follow, each describes a road with three integers c1, c2 and L, which are the pair of cities connected by a road and the length of that road, respectively. It is guaranteed that there exists at least one path from C1 to C2.
Output
For each test case, print in one line two numbers: the number of different shortest paths between C1 and C2, and the maximum amount of rescue teams you can possibly gather.
All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.
Sample Input
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
Sample Output
2 4 参考http://www.cnblogs.com/yanhaiming/archive/2012/12/01/2797064.html
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1000;
const int INF = 100000000;
//图的邻接矩阵
int road[N][N];
//标记某一节点是否被访问过
bool isVisited[N];
//记录每一节点的权值
int team_num[N];
int dis[N];
//最短路径的数目
int path_num =0;
//最大的医疗队的数目
int g_max_team_num = 0;
void initData()
{
int i,j;
for(i=0; i<N; i++)
{
isVisited[i] = false;
team_num[i] = 0;
dis[i] = INF;//初始化为无穷大.
for(j=0; j<N; j++)
{
road[i][j] = INF;
road[j][i] = INF;
}
}
}
//单源最短路径算法。
void Dijstra(int n,int src, int des)
{
int i,j;
for(i=0; i<n; i++)
dis[i] = road[src][i];
isVisited[src] = true;
for(i=0; i<n-1; i++)//最多循环n-1次就足够了,选n-1个最小值。
{
int minDis = INF;
int cur = 0;
for(j=0; j<n; j++)
if(!isVisited[j] && dis[j]<minDis)
{
minDis = dis[j];
cur = j;
}
if(minDis == INF) //已经完成了连通路径的遍历。
return;
//dis[cur]为dis数组中的最小值,访问节点cur.
isVisited[cur] = true;
//更新Dis数组的内容.
for(j=0; j<n; j++)
if(road[cur][j] <INF && dis[j] > dis[cur] + road[cur][j])
dis[j] = dis[cur] + road[cur][j];
}
}
//深度搜索来得到最短路径的数目。
void dfs(int n,int cId,int des,int curDis,int curTeamsNum)
{
isVisited[cId] = true;
if(cId == des)
{
if(curDis == dis[des]) //找到一条最短路径
{
path_num++;//最短路径数目加1
if(curTeamsNum > g_max_team_num)
g_max_team_num = curTeamsNum;
}
return;
}
if(curDis > dis[des]) //当前的路径长度已经超过最短路径,就没有必要继续搜索了。
return;
//从城市cId开始搜索
for(int i=0; i<n; i++)
{
/*
if(!isVisited[i] && road[cId][i] < INF)//如果城市i没有被访问过,且cId到i连通。
{
//isVisited[i] = true;
dfs(n,i,des,curDis+road[cId][i],curTeamsNum+team_num[i]);
isVisited[i] = false;
}
*/
//这样的剪枝比上一种更加强大。
if(dis[cId] + road[cId][i] == dis[i])
dfs(n,i,des,curDis+road[cId][i],curTeamsNum+team_num[i]);
}
}
int main()
{
int i,j,n,m,c1,c2,L,src,des;
initData();
cin>>n>>m>>src>>des;
for(i=0; i<n; i++)
cin>>team_num[i];
for(i=0; i<m; i++)
{
cin>>c1>>c2>>L;
road[c1][c2] = L;
road[c2][c1] = L;
}
Dijstra(n,src,des);
//重置各city的被访问状态。
for(i=0; i<n; i++)
isVisited[i] = false;
dis[src] = 0;
dfs(n,src,des,0,team_num[src]);
cout<<path_num<<" "<<g_max_team_num<<endl;
return 0;
}
浙大 pat 1003 题解的更多相关文章
- 浙大pat 1035题解
1035. Password (20) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To prepare f ...
- 浙大pat 1025题解
1025. PAT Ranking (25) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Programmi ...
- 浙大pat 1011题解
With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...
- 浙大PAT 7-06 题解
#include <stdio.h> #include <iostream> #include <algorithm> #include <math.h> ...
- 浙大pat 1012题解
1012. The Best Rank (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To eval ...
- 浙大 pat 1038 题解
1038. Recover the Smallest Number (30) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
- 浙大 pat 1047题解
1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- 浙大pat 1054 题解
1054. The Dominant Color (20) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard Behind the scen ...
- 浙大pat 1059 题解
1059. Prime Factors (25) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given ...
随机推荐
- session验证登陆- 页面跳转
用session验证登陆,当用户想访问一个页面时由于没有登录,就跳转到登录页面,登录后跳转到用户请求的页面,在session跳转中传上次请求的页面. 怎么获得这个url值并跳转到该页面呢? 以此跳转 ...
- [转]ARM/Thumb2PortingHowto
src: https://wiki.edubuntu.org/ARM/Thumb2PortingHowto#ARM_Assembler_Overview When you see some assem ...
- yii2.0 文件上传
Yii 2.0 出来好长时间了,一直都是看下官方网站,没实践过,今天弄了下图片上传操作. 1创建一个简单的数据表 mysql> desc article; +---------+-------- ...
- ASP.NET MVC企业开发的基本环境
ASP.NET MVC企业开发的基本环境[资源服务器概念] 学完了ASP.NET MVC4 IN ACTION 六波以后 企业开发演习 标签:AaronYang 茗洋 EasyUI1.3.4 ...
- ASP.NET MVC页面UI之联动下拉选择控件(省、市、县联动选择)
地区选择操作在WEB应用中比较常见的操作,本文在.net mvc3下实现了省市县三级联动选择功能. 本文博客出处:http://www.kwstu.com/ArticleView/admin_2013 ...
- 关于Update语句的锁
关于Update语句的锁 环境:MSSQL2005,在Read Committed级别 语句A:begin tranUpdate Table Set f1='xxx' where f2='ttt' ...
- NSLocalizedString不起作用
程序TESTAPP 环境:XCODE 4.6 OSX 10.8.4 MAC BOOK AIR 2011年版 代码 [doneButton setTitle:NSLocalizedString(@&q ...
- 应聘linux/ARM嵌入式开发岗位
**************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...
- java BigInteger源码学习
转载自http://www.hollischuang.com/archives/176 在java中,有很多基本数据类型我们可以直接使用,比如用于表示浮点型的float.double,用于表示字符型的 ...
- 配置Ubuntu Server高速apt-get源
方法: 1.修改源地址:cp /etc/apt/sources.list /etc/apt/sources.list.backvim /etc/apt/sources.list 加入如下内容(中科大的 ...