HDU 2433 (最短路+BFS+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=2433
这个问题因为路径都是1,所以可以用bfs遍历
可以看这几篇文章讲解:
http://blog.csdn.net/panyanyany/article/details/7215069
(这篇代码非常清晰,而且效率很高)
http://www.cppblog.com/keroro/archive/2013/05/27/200622.html?opt=admin
#include <cstdio>
#include <queue>
#include <vector>
using namespace std; #define MEM(a,v) memset (a,v,sizeof(a))
// a for address, v for value #define max(x,y) ((x)>(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y)) const int L = ;
const int INF = <<; bool used[L], bCnet, bInit ;
int n, m ;
int dist[L], map[L][L], sum_d[L], pre[L][L]; //边表
struct Edge
{
int u,v;
}; Edge e[*L]; int bfs(int beg)
{
MEM(used,false);
MEM(dist,); used[beg] = true; queue<int> q;
q.push(beg); int i; while(!q.empty())
{
int t = q.front();
q.pop();
for(i = ;i<=n;i++)
{
if(!used[i] && map[t][i])
{
used[i] = true;
dist[i] = dist[t]+; //初始化 bInit =true
//初始化后 bfs = false
if(bInit)
pre[beg][i] = t;
//pre储存的是beg树里面,i的上一个元素
//这样只需判断pre[x][u] ==v 和pre[x][v] == u
//就可以知道x树里面有没有uv边 q.push(i);
}
}
} int sum = ; //求出点beg到各边的距离和
// 从 beg+1 开始 和从 1 开始,效果差不多
for(i = beg+;i<=n;i++)
{
if(!dist[n])
return INF;
else
sum+=dist[i];
}
return sum; } int main()
{
int i,j; int u,v,sum,res; while(~scanf("%d%d",&n,&m))
{
MEM(map,);
MEM(pre,); for(i = ;i<=m;i++)
{
scanf("%d%d",&u,&v);
map[u][v] = ++map[v][u]; //如果有重复边的话,map为2 e[i].u = v;
e[i].v = u;
} sum = ;
bInit = true;
bCnet = true; //求出每个点到其他点的距离和
for(i = ;i<=n;i++)
{
sum_d[i] = bfs(i);
sum+=sum_d[i]; if(sum>=INF)
{
bCnet = false;
break;
}
} bInit = false; //删除边
for(i = ;i<=m;i++)
{
//uv为删除的边
u = e[i].u;
v = e[i].v; // map[u][v] 判断有无重边,可以优化300多MS
if(bCnet && map[u][v] == )
{
res = ;
for(j = ;j<=n;j++)
{
//j树里不存在删除的边
// 最重要的剪枝,否则直接超时
if(pre[j][u] != v && pre[j][v] !=u)
{
res += sum_d[j];
}
else
{
//存在uv边,j树重新bfs
--map[u][v];
--map[v][u];
res += bfs(j);
++map[u][v];
++map[v][u]; if(res >= INF)
break; } } }
else
res=sum; if(res >= INF)
puts("INF");
else
printf("%d\n",res*); } } return ;
}
HDU 2433 (最短路+BFS+剪枝)的更多相关文章
- hdu_1253_胜利大逃亡(bfs+剪枝)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题意:三维BFS,不解释 题解:DFS+剪枝会超时,裸BFS会超时,BFS+剪枝才能AC,有点伤 ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- UESTC 30 &&HDU 2544最短路【Floyd求解裸题】
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 5521 最短路
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...
- HDU-1226 超级密码 (BFS+剪枝)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进 ...
- HDU 1501 Zipper 【DFS+剪枝】
HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...
- HDU6223 Infinite Fraction Path bfs+剪枝
Infinite Fraction Path 这个题第一次看见的时候,题意没搞懂就没做,这第二次也不会呀.. 题意:第i个城市到第(i*i+1)%n个城市,每个城市有个权值,从一个城市出发走N个城市, ...
- HDU - 2544最短路 (dijkstra算法)
HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...
随机推荐
- springMVC和Struts异同
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...
- 【微信小程序】——rpx、px、rem等尺寸间关系浅析
最近开发微信小程序,在写样式表的时候发现用PX的效果不太理想,而官方文档用rpx来做响应式布局单位,就仔细研究了下,在此做个小总结: 这里先引用官方定义的尺寸单位‘rpx’:可以根据屏幕宽度进行自适应 ...
- 注解中用于@target的方法annotation/--ElementType.METHOD,ElementType.TYPE对应方法,类接
@Target: @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages.types(类.接口.枚举.Annotation类型).类型成员(方法.构造 ...
- 记一次升级Ubuntu内核
uname -a 查看当前使用内核版本 升级指定内核 apt-get install linux-image-4.4.0-131-generic dpkg --get-selections | ...
- 苹果隐私条例更新:收集用户电话和 Email 数据
简评:苹果现在会收集用户的电话和电子邮件,作为用户「信任评级」的一部分,我还是支持的,因为园长被黑产攻击 AppleID,直接刷爆了我的卡!但是在大环境看,隐私已经不存在了. Apple 最近悄悄为 ...
- 后序线索化二叉树(Java版)
前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...
- 40.oracle事务
一.事务特性 事务必须具备以下四个特性,简称ACID属性 原子性(Atomicity):事务是一个完整的操作.事务的各步操作是不可分割的(原子的):要么都执行,要么都不执行场景:银行转账 A-100 ...
- Java线程池的选择
在java的concurrent.Executors主要提供两种线程池:无固定线程数但有限制任务队列的cachedThreadPool与有固定线程数但无任务队列限制的fixedThreadPool,这 ...
- linux 创建软链接和硬链接
Linux 系统中有软链接和硬链接两种特殊的“文件”. 软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录. 硬链接则透过文件系统的inode来产生新档名,而不是产生新档案. ...
- JVM-类加载过程(Java类的生命周期)
什么是类加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的 ...