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.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...
随机推荐
- 使用X-Pack插件来进行权限控制
1.为elasticsearch安装X-Pack插件.进入 elasticsearch根目录,执行: bin/elasticsearch-plugin install x-pack杀掉进程,重启es, ...
- tcping测试端口是否畅通
https://elifulkerson.com/projects/tcping.php 下载tcping.exe 执行exec文件或者放到C:\Window目录下执行 tcping IP 端口
- linux互传文件nc命令
使用nc命令可以很快的在两台主机传递文件,且不需要在同一网段,只要设置好端口即可. 一.安装(CentOS下) yum install -y nc (需要root权限,可以用加上sudo) 二.使用 ...
- HDU-1160-FatMouse's Speed(线性DP,LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- python 动态生成变量
locals() 函数会以字典类型返回当前位置的全部局部变量 createVar = locals() listTemp = [1,2,3,4] for i,s in enumerate(listTe ...
- 【笔记】AJAX基础
[笔记]AJAX基础 Django AJAX 知识储备:JSON 什么是 JSON JSON 是轻量级的文本数据交换格式 JSON 独立于语言和平台.JSON 解析器和 JSON 库支持许多不同的编 ...
- Go语言目录
为什么学习Go语言 第一章 环境搭建 Windows搭建Go语言环境 第二章 Go语言基础 Go语言介绍 Go语言命名 Go语言内置类型和函数 Go语言特殊函数介绍 Go语言运算符 第三章 Go语言程 ...
- winform FormBordStyle=none 及 wpf FormBordStyle=none 的鼠标点击移动问题
winform: //bool formMove = false;//窗体是否移动 //Point formPoint;//记录窗体的位置 private void Login_MouseDown(o ...
- SSH使用密钥免密码登录
使用ssh远程连接服务器,有两种身份校验方式:账号密码和秘钥.使用秘钥的方式理论上更加安全,而且免去了输入密码的步骤,使用起来更方便(尤其对于sftp,scp等). 设置 SSH,打开密钥登录功能 编 ...
- 033-JsonUtils 工具类模板
模板一:使用的是jackson package cn.e3mall.common.utils; import java.util.List; import com.fasterxml.jackson. ...