PAT1018——最短路加DFS
http://pat.zju.edu.cn/contests/pat-a-practise/1018
在杭州各个点,有很多自助自行车的点,最大容纳点为CMAX,但比较适合的情况是CMAX/2,
现在从起点到终点,在最短路的情况下,调整各个车站的自行车数量使之CMAX/2,问开始时要提供的自行车最少与最后剩余的自行车最少的路径
最短路+DFS
在DFS时加上一个剪枝 if(lenth>dis[first])return ;就可以通过所有点
#include<stdio.h>
#define MAX 0x3ffffff
int cmax,N,end,M;
int node[];
int map[][];
int path[]; int rpath[];
int in,out,nowstep,rstep; bool hash[][];
int shortlen; int dis[];
bool use[];
int ok=; void dijk( )
{
int n=N,m;
int min,rj,i,j;
for(j=;j<=n;j++)
{
dis[j]=map[][j];
use[j]=;
}
use[]=;
for(i=;i<n;i++)
{
min=MAX;
for(j=;j<=n;j++)
{
if(use[j]==)continue;
if(dis[j]<min)
{
min=dis[j];
rj=j;
}
} use[rj]=;
for(j=;j<=n;j++)
{
if(use[j]==)continue;
if(dis[j]>dis[rj]+map[rj][j])
dis[j]=dis[rj]+map[rj][j];
}
} shortlen=dis[end];
} void print(){
int i;
printf("%d",in);
printf("");
for(i=;i<=rstep;i++){
printf("->%d",rpath[i]);
}
printf(" %d\n",out);
} void cal(){
int tin=,tout=;
int i,add=;
for(i=;i<=nowstep;i++){
add+=node[path[i]]-cmax/;
if(add<tin)tin=add;
}
if(tin>)tin=;
else tin=-tin;
tout=add+tin; if((tin<in)||((tin==in)&&tout<out)){
in=tin;
out=tout;
if(in==&&tout==)ok=;
rstep=nowstep;
for(i=;i<=nowstep;i++){
rpath[i]=path[i];
}
} //test
/*
printf("%d",tin);
printf(" 0");
for(i=1;i<=nowstep;i++){
printf("->%d",path[i]);
}
printf(" %d\n",tout);
*/
}
void dfs(int step,int first,int lenth)
{
if(ok==||lenth>dis[first])return ; //lenth>dis[first] 是个关键的剪枝,不加的话最后一个点会超时
if(lenth==shortlen&&first==end){
nowstep=step;
cal();
} int j;
for(j=;j<=N;j++){
if(hash[first][j]==||map[j][first]==MAX)continue;
hash[first][j]=hash[j][first]=;
path[step+]=j;
dfs(step+,j,lenth+map[first][j]);
hash[first][j]=hash[j][first]=;
}
} int main()
{
while(scanf("%d%d%d%d",&cmax,&N,&end,&M)!=EOF){
int i,j,temp;
ok=;
in=;
out=; for(i=;i<=N;i++){
for(j=;j<=N;j++){
map[i][j]=MAX;
hash[i][j]=;
}
} for(i=;i<=N;i++){
scanf("%d",&node[i]);
} int ll,rr,v;
for(i=;i<=M;i++){
scanf("%d%d%d",&ll,&rr,&v);
map[ll][rr]=map[rr][ll]=v;
}
dijk();
dfs(,,);
print();
} return ;
}
PAT1018——最短路加DFS的更多相关文章
- NOIP 2013 货车运输 最大生成树加DFS巧妙AC
#include<set> #include<map> #include<cmath> #include<queue> #include<stac ...
- HDU(1572),最短路,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572 很久没写深搜了,有点忘了. #include <iostream> #include ...
- poj3160强连通分量加dfs
After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such ...
- Treasure Hunt--poj1066(最短路加判断线段的关系)
http://poj.org/problem?id=1066 题目大意:有n条线段 他们都在这个房间里 最后有一个点代表起始位置 现在想通过墙出去 他只能爆破每个房间的中点的门 问最少的门通 ...
- Labyrinth 树的直径加DFS
The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is d ...
- HDU - 2066 最短路+加一个节点
一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到文件结束. 每组的第一行是三个整数M,Z,Y 接着有M行, ...
- nyoj 203 三国志(最短路加01背包)
三国志 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...
- zoj 2110 很好的dfs+奇偶剪枝
//我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...
- hdu 6852Path6(最短路+最小割)
传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...
随机推荐
- spring security使用哈希加密的密码
之前我们都是使用MD5 Md5PasswordEncoder 或者SHA ShaPasswordEncoder 的哈希算法进行密码加密,在spring security中依然使用只要指定使用自定义加密 ...
- canal入门使用
1.下载canal安装包: 地址:https://github.com/alibaba/canal/releases 图例: 2.将下载好的安装包复制到Linux,解压 3.修改配置文件 vi con ...
- HTTP与抓包
HTTP就是超文本传输协议,底层使用socket TCP长连接,基于请求与响应,是同步请求. socket 绝对多数语言都是支持socket的,底层走的是二进制传输. HTTP协议实际上是对Socke ...
- Hive-行转列(explode)
场景:通过parseHtml UDF解析一串HTML,返回一以 @@ 分割的字符串,使用split分割字符串进数组中,然后将数组的元素转列. 开始的写法 SELECT id, legal_person ...
- MFC中如何在一个类中调用另一个类的控件
学习记录: 两个类,一个为主类 1个为:CCkDlg,主类 1个为: Https,用来做HTTPS请求获得页面状态. 测试界面如下: CCkDlg 类里定义函数 void CCkDlg::printf ...
- sqoop数据导入到Hdfs 或者hive
用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql http://www.cnblogs.com/xuyou551/p/7999773.html 用sqoop将mysql ...
- Word Search, 在矩阵中寻找字符串,回溯算法
问题描述: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...
- python基础7 - 函数2
4. 使用元组让函数返回多个值 利用 元组 同时返回温度和湿度 def measure(): """返回当前的温度""" temp = 39 ...
- spring3: AOP 之 通知顺序
如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序.总共有两种情况:同一切面中通知执行顺序.不同切面中的通知执行顺序. ...
- Caffe初试
1.基本概念 Caffe是一个比较流行的神经网络框架,它支持C++.Python等语言,容易上手,但是代码貌似不怎么好读,等有空我...;) 2.Windows10下的部署 我把我Windows下的编 ...