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的最小路径当然是最 ...
随机推荐
- LAMP服务器的搭建
LAMP是一组构建Web应用平台的开源软件解决方案,它是一个开源套件组合.其中L:linux,A :Apache HTTP服务器,M : MySQL或MariaDB,P : perl或Python.这 ...
- 一篇文章学会spark-streaming
版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...
- Gamma函数相关matlab代码
1.Gamma函数: Gamma函数matlab代码: x=:0.5:5syms t y=)*exp(-t),,inf) y=double(y) plot(x,y,) 图像如下: 2.lgΓ(x)函数 ...
- angular2.x 多选框事件
angular2.x - 4.x 的多选框事件 ng2 -- ng4 反正都是用es6 都统称为2.x吧. 下面贴代码 html界面 <div class="row"> ...
- Firefox 下载、附加组件、Flash插件、缓存位置(附加Chrome下载和Opera下载)
Firefox 下载的FTP页面: http://ftp.mozilla.org/pub/firefox/releases/ Firefox下载官方页面: https://www.mozilla.or ...
- 个人作业4——alpha阶段个人小结
一.个人总结 在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 请用自我评价表:http://www.cnblogs.com/xinz/p/3852177.html 有 ...
- docker建立和共享文件(服务器和docker之间的共享)
建立序列号:sudo docker run -it domimiek/deep-base /bin/bash 回撤后会出现一个序列号(记住) 开始:sudo docker start 序列号 当 ...
- WinForm 创建与读写配置文件
(转自:http://www.cnblogs.com/SkySoot/archive/2012/02/08/2342941.html) 1. 创建 app.config 文件: 右击项目名称,选择“添 ...
- 【转】Hibernate 原汁原味的四种抓取策略
最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...
- .Net 中的IL中间语言基本语法
一.前言 IL是什么? Intermediate Language (IL)微软中间语言 C#代码编译过程? C#源代码通过LC转为IL代码,IL主要包含一些元数据和中间语言指令: JIT编译器把IL ...