PAT1018——最短路加DFS

时间:2022-09-11 23:46:08

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的更多相关文章

  1. NOIP 2013 货车运输 最大生成树加DFS巧妙AC

    #include<set> #include<map> #include<cmath> #include<queue> #include<stac ...

  2. HDU&lpar;1572&rpar;&comma;最短路,DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572 很久没写深搜了,有点忘了. #include <iostream> #include ...

  3. poj3160强连通分量加dfs

    After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such ...

  4. Treasure Hunt--poj1066&lpar;最短路加判断线段的关系&rpar;

    http://poj.org/problem?id=1066 题目大意:有n条线段 他们都在这个房间里   最后有一个点代表起始位置 现在想通过墙出去  他只能爆破每个房间的中点的门   问最少的门通 ...

  5. Labyrinth 树的直径加DFS

    The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is d ...

  6. HDU - 2066 最短路&plus;加一个节点

    一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到文件结束. 每组的第一行是三个整数M,Z,Y 接着有M行, ...

  7. nyoj 203 三国志(最短路加01背包)

    三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...

  8. zoj 2110 很好的dfs&plus;奇偶剪枝

    //我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue&gt ...

  9. hdu 6852Path6(最短路&plus;最小割)

    传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...

随机推荐

  1. 全球首个实战类微信小程序开发教程

    小木学堂专注于企业实战开发和经验传授,所以微信小程序诞生这么大的事怎么能不带着大家一起学习学习呢,所以小木学堂讲师连夜赶工学习并实战开发了微信小应用的第一个程序,并录制了课程现免费分享给大家.这个速度 ...

  2. java&period;lang&period;UnsatisfiedLinkError&colon; Unable to load library &&num;39&semi;xxx&&num;39&semi;&colon; Native library &lpar;win32-x86-64&sol;ID&lowbar;Fpr&period;dll&rpar;

    使用 JNA 调用 dll 库,因为 dll 库是32 位的,而 jvm 是 64位的,所以发生的错误: java.lang.UnsatisfiedLinkError: Unable to load ...

  3. 公测后&comma;微信小程序应用可能被拒原因&period;

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 34.0px "PingFang SC Semibold"; color: #23232 ...

  4. zabbix邮件报警

    #!/usr/bin/python #coding:utf-8 import smtplib from email.mime.text import MIMEText import sys mail_ ...

  5. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  6. 【es6】数组排重

    let set = new Set([1,2,3,4,4,4,4,4]); console.log( Array.from(set) ); //输出:[ 1, 2, 3, 4 ]

  7. 安装 VMware CentOS Xmanager Xshell

    1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:https://www.centos.org/download/DVD ISO:普通光盘完整安装版镜像,可离线安装到计算机硬盘上, ...

  8. Elastic Stack之ElasticSearch分布式集群二进制方式部署

    Elastic Stack之ElasticSearch分布式集群二进制方式部署 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道ELK其实就是Elasticsearc ...

  9. Linux内核同步

    Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...

  10. Effective C&plus;&plus; 随笔(3)

    条款12: 以对象管理资源 两种只能指针: std:auto_ptr<> 当使用copy操作室,原先的智能指针指向为null std:tr1:share_ptr<int> sp ...