题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2433 ,最短路(SPFA或优化过的Dijstra) + 剪枝优化

  这道题关键还是在几个剪枝上面,没有剪枝会TLE。


先说下几个数组的意义:

  a[]存储M条边的信息;vis[i]表示点i是否访问过;path[i][u][v]表示在点i的所有最短路里,边u - v是否属于某条最短路;cnt[u][v]表示边u - v出现的次数;pos[u][i]表示第i条边在邻接表e[u]中的位置;sum[i]表示预处理时顶点i到所有顶点的最短路的和;dist[i]表示顶点i到其他顶点的最短路的距离;e[i]即邻接表,存储与顶点i邻接的点的信息。

算法:

  先预处理一遍,求得每个顶点的最短路,并存在sum[i]中,如果预处理时发现图不连通,则M次询问都输出"INF";

  处理第i条边的时候,如果这条边出现不止一次,即 cnt[u][v] > 1,这时候除掉这条边后不影响结果,输出预处理的结果即可;

  如果不满足上述条件,就开始求n个顶点的最短路情况:求顶点i的最短路的时候,如果边u - v不在顶点i的最短路中,即 path[i][u][v] == 0时,这时候这条边除掉不影响顶点i的最短路的结果,所以仍为sum[i];如果出现去掉这条边图不连通的情况,这次询问输出"INF"。

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
#define eps 1e-8
#define INF 1e8
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int MOD = ;
const int maxn = + ;
const int N = + ;
struct Edge {
int v , w;
bool operator < (const Edge &tmp) const {
return w > tmp.w;
}
} a[N];
bool vis[maxn] , path[maxn][maxn][maxn];
int cnt[maxn][maxn] , pos[maxn][N];
int sum[maxn] , dist[maxn];
vector <Edge> e[maxn]; int Dijstra(int s , int n , bool ch) //Dijstra + 优先队列
{ //ch表示是否为预处理,因为在预处理的时候才需要判断path[i][u][v]的情况
memset(vis , , sizeof(vis));
for(int i = ; i <= n ; i++)
dist[i] = INF;
dist[s] = ;
priority_queue <Edge> que;
Edge tmp = {s , };
que.push(tmp);
while(!que.empty()) {
Edge u = que.top();
que.pop();
if(vis[u.v])
continue;
vis[u.v] = ;
for(int i = ; i < e[u.v].size() ; i++) {
int j = e[u.v][i].v;
if(dist[j] > dist[u.v] + e[u.v][i].w) {
dist[j] = dist[u.v] + e[u.v][i].w;
if(!vis[j]) {
if(ch) //这条边在最短路中
path[s][u.v][j] = path[s][j][u.v] = ;
que.push(e[u.v][i]);
}
}
}
}
int ans = ;
for(int i = ; i <= n ; i++) {
if(dist[i] >= INF)
return INF;
ans += dist[i];
}
return ans;
}
int main()
{
int n , m , u , v , i , ans;
while(~scanf("%d %d" , &n , &m))
{
memset(path , , sizeof(path));
memset(cnt , , sizeof(cnt));
for(i = ; i <= n ; i++)
e[i].clear();
for(i = ; i <= m ; i++) {
scanf("%d %d" , &u , &v);
Edge tmp = {v , };
e[u].push_back(tmp);
tmp.v = u;
e[v].push_back(tmp);
pos[u][i] = e[u].size() - ;
pos[v][i] = e[v].size() - ;
cnt[u][v]++;
cnt[v][u]++;
a[i].v = u;
a[i].w = v;
}
bool flag = false;
for(i = , ans = ; i <= n ; i++) {
sum[i] = Dijstra(i , n , );
if(sum[i] == INF) {
flag = true;
break;
}
ans += sum[i];
}
for(i = ; i <= m ; i++) {
u = a[i].v;
v = a[i].w;
if(flag) {
puts("INF");
} else if(cnt[u][v] > ) {
printf("%d\n" , ans);
} else {
int tmp , res;
res = ans;
e[u][pos[u][i]].w = INF; //删掉第i条边
e[v][pos[v][i]].w = INF;
for(int j = ; j <= n ; j++) {
if(path[j][u][v]) {
tmp = Dijstra(j , n , );
if(tmp == INF) {
puts("INF");
break;
}
res += tmp - sum[j];
}
}
if(tmp != INF)
printf("%d\n" , res);
e[u][pos[u][i]].w = ; //还原这条边
e[v][pos[v][i]].w = ;
}
}
}
return ;
}

HDU2433 最短路 + 剪枝优化的更多相关文章

  1. 搜索(剪枝优化):HDU 5113 Black And White

    Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...

  2. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...

  3. TensorFlow官方发布剪枝优化工具:参数减少80%,精度几乎不变

    去年TensorFlow官方推出了模型优化工具,最多能将模型尺寸减小4倍,运行速度提高3倍. 最近现又有一款新工具加入模型优化"豪华套餐",这就是基于Keras的剪枝优化工具. 训 ...

  4. 图解Leetcode组合总和系列——回溯(剪枝优化)+动态规划

    Leetcode组合总和系列--回溯(剪枝优化)+动态规划 组合总和 I 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...

  5. HDU 6382 odds (暴力 + 剪枝优化)

    odds Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Subm ...

  6. JZYZOJ1442 [noip2013]华容道 bfs 最短路 剪枝

    http://172.20.6.3/Problem_Show.asp?id=1442 想到最短路的简直神了,如果我写我大概只能写一个30分的bfs. 从数据范围可以看出思路是bfs剪枝,但这里的剪枝是 ...

  7. dfs的剪枝优化

    两个剪枝问题 1. 当两点的距离(需要走的步数)大于剩下的时间时 剪去 2.奇偶剪枝问题 如果起点到终点所需走的步数的奇偶性与时间奇偶性不同的时候 剪去 起点到终点步数的奇偶性的判断 首先 明确点的奇 ...

  8. LeetCode37 使用回溯算法实现解数独,详解剪枝优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...

  9. HNU 12847 Dwarf Tower(最短路+队列优化)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12847 解题报告:有n样物品,编号从1到n第i样物品可以通过金 ...

随机推荐

  1. Ubuntu下Apache2+Tomact7安装、配置及整合

    安装Apache2 命令:apt-get install apache2 cd  /etc/apache2 打开apache.conf 加入 ServerName localhostDirectory ...

  2. scrapy-redis源码解读之发送POST请求

    1 引言 这段时间在研究美团爬虫,用的是scrapy-redis分布式爬虫框架,奈何scrapy-redis与scrapy框架不同,默认只发送GET请求,换句话说,不能直接发送POST请求,而美团的数 ...

  3. If,for,range混合使用笔记-(VBA视频教程2:使用IF进行逻辑判断)

    -- 新建表格:#单元格a1-a100全部等于1的代码 Sub test() Dim i As Integer For i = To Range( Next End Sub -- 新建表格:#单元格a ...

  4. VS Code(待补充)

    使用! 然后Tab  快速生成html文档结构 快速生成一个类   .类名  会有提示 .container.box .col-6*2 VisualStudio Code怎么同时编辑多处?

  5. hdu3830(lca + 二分)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3830 题意: 有三个点 a, b, c, 对于其中任意一点 x 可以跨过一个点移动到另一个位置, 当 ...

  6. 解读人:刘杰,Targeted Quantitative Kinome Analysis Identifies PRPS2 as a Promoter for Colorectal Cancer Metastasis(PRM-磷酸化激酶定量发现结肠癌转移促进因子-PRPS2)

    关键词:PRM,kinase,colorectal cancer, metastasis, PRPS2 来自加州大学河滨分校的Yinsheng Wang教授应用PRM技术筛选出介导结肠癌细胞转移促进因 ...

  7. Google Guetzli是如何压缩图片的?

    你可能已经知道,现在网页文件的平均大小比Doom游戏的安装文件还还大. 文件变大的原因之一是图片的增加,并且还需要支持更高的分辨率. Google来拯救了 Google刚刚发布了一种新的JPEG压缩算 ...

  8. Ryzen 移动平台上安装 Gentoo Linux

    Linux 内核对于跟进支持 Ryzen 移动低压 CPU 的热情似乎和市面上寥寥无几的 Ryzen 笔记本热度十分吻合.虽然从 Linux 4.11 起就对 Ryzen 桌面 CPU 有较好的支持, ...

  9. myclipse运行web的一些问题

    一.修改项目访问路径 项目右键>properties(属性)>输入web搜索>双击web>修改Web-Content root内容即可 二. myeclipse中web项目不自 ...

  10. day13列表推导式作业详解

    1.day13题目 2,用列表推导式做下列小题 (1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 (2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表 (3)求M ...