hdu2433 spfa+mark[x][u][v]优化
题意:
删除每一条边求最短路的和,每删除一个就输出一个和.
思路:
直接暴力可定TLE了,自己SB的尝试过,就要剪纸,当每次输出一个答案的时候我们没有必要再从新暴力全跑一边最短路,我们可以开一个数组mark[s][u][v]来标记,当s为起点是边u,v是否被用过(其实是可能,记录的时候是更新就假设被用过,但也能达到剪纸的目的),开个sum[i]数组记录已i为起点时的和,如果被用过那么以s为起点的就得从新跑,否则不用(跑sum[s]也不会变化,所以没必要跑).这样能节省很多时间,但自己想想,如果管理员精心设计各种数据,让你每一条边都可能被用过那么就TLE了,但估计不会那么变态,卡数据可以,不能变态的卡,不然题目的答案岂不是要唯一化了..
#include<stdio.h>
#include<string.h>
#include<queue>
#define N_node 105
#define N_edge 6100
#define inf 1000000000
using namespace std;
typedef struct
{
int to ,cost ,next;
}STAR;
STAR E[N_edge];
int list[N_node] ,tot;
int s_x[N_node];
int mark[N_node][N_node][N_node];
int map[N_node][N_node];
int sum[N_node];
int Q[N_edge>>1][2];
void add(int a ,int b ,int c)
{
E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot;
}
void spfa(int s ,int n ,int key ,int u ,int v)
{
int mark_q[N_node] = {0};
mark_q[s] = 1;
for(int i = 0 ;i <= n ;i ++)
s_x[i] = inf;
s_x[s] = 0;
queue<int>q;
q.push(s);
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
mark_q[tou] = 0;
for(int k = list[tou] ;k ;k = E[k].next)
{
xin = E[k].to;
if(u == tou && v == xin || u == xin && v == tou)
continue;
if(s_x[xin] > s_x[tou] + E[k].cost)
{
s_x[xin] = s_x[tou] + E[k].cost;
if(key == 1)
mark[s][tou][xin] = mark[s][xin][tou] = 1;
if(!mark_q[xin])
{
mark_q[xin] = 1;
q.push(xin);
}
}
}
}
return ;
}
int main ()
{
int n ,m ,i ,a ,b ,ii ,jj;
while(~scanf("%d %d" ,&n ,&m))
{
memset(list ,0 ,sizeof(list));
memset(map ,0 ,sizeof(map));
tot = 1;
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d" ,&a ,&b);
map[a][b] ++;
map[b][a] ++;
add(a ,b ,1);
add(b ,a ,1);
Q[i][0] = a;
Q[i][1] = b;
}
int first = 0;
memset(sum ,0 ,sizeof(sum));
memset(mark ,0 ,sizeof(mark));
for(i = 1 ;i <= n ;i ++)
{
spfa(i ,n ,1 ,0 ,0);
for(ii = 1 ;ii <= n ;ii ++)
{
sum[i] += s_x[ii];
if(s_x[ii] == inf)
break;
}
first += sum[i];
if(ii != n + 1)
break;
}
if(i != n + 1)
{
for(i = 1 ;i <= m ;i ++)
printf("INF\n");
continue;
}
for(i = 1 ;i <= m ;i ++)
{
a = Q[i][0];
b = Q[i][1];
if(map[a][b] > 1)
{
printf("%d\n" ,first);
continue;
}
int now = first;
int kk = 0;
for(ii = 1 ;ii <= n ;ii ++)
{
if(mark[ii][a][b])
{
spfa(ii ,n ,0 ,a ,b);
int s = 0;
for(jj = 1 ;jj <= n ;jj ++)
{
s += s_x[jj];
if(s_x[jj] == inf)
break;
}
now = now - sum[ii] + s;
if(jj != n + 1)
break;
}
}
if(ii != n + 1)
{
printf("INF\n");
continue;
}
printf("%d\n" ,now);
}
}
return 0;
}
hdu2433 spfa+mark[x][u][v]优化的更多相关文章
- 关于SPFA的双端队列优化
7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...
- POJ——3159Candies(差分约束SPFA+前向星+各种优化)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 28071 Accepted: 7751 Descrip ...
- spfa + slf优化
最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...
- Codeforces 938D Buy a Ticket 【spfa优化】
用到了网络流的思想(大概).新建一个源点s,所有边权扩大两倍,然后所有的点向s连边权为点权的无向边,然后以s为起点跑spfa(S什么L优化的),这样每个点到s的距离就是答案. 原因的话,考虑答案应该是 ...
- hdu 1874(最短路 Dilkstra +优先队列优化+spfa)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- SPFA 的两个优化
From NOCOW SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将 ...
- 【最短路径】 SPFA算法优化
首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...
- 队列优化dijsktra(SPFA)的玄学优化
转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2 优化 对一些数 ...
- SPFA的两个(卡时)优化
SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队 ...
随机推荐
- 一文了解Python的迭代器的实现
本文对迭代器的解释参考自:https://www.programiz.com/python-programming/iterator 最后自己使用迭代器实现一个公平洗牌类. 博主认为,理论来自实践,假 ...
- Cloud Alibabab笔记问世,全网详解仅此一份手慢无
转: Cloud Alibabab笔记问世,全网详解仅此一份手慢无 什么是Spring cloud alibaba Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案, ...
- 使用syncthing和蒲公英异地组网零成本实现多设备实时同步
设想一个场景,如果两台电脑之间可以共享一个文件夹,其中一个增删更改其中的内容时,另一个也能同步更新,而且速度不能太慢,最好是免费的.那么syncthing就可以满足这个要求.syncthing可以实现 ...
- Picgo + Gitee +Typora(自动上传)搭建markdown免费图库
Picgo + Gitee +Typora(自动上传)搭建markdown免费图库 前言: 在写博客的是时候,之前那都是直接在博客网站上面写好了,再一一插入图片,当要在同时2个以上的博客上面发表的 ...
- 【知识点】 C++寄存器优化
作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14502076.html 目录 一.前言 二.代码实例 三.volatile作用 一.前言 在c++中什么情况下, ...
- python爬虫加定时任务,制作微信提醒备忘录
一.任务的记录与提取 1.1 制作每日任务 为了便于爬取,推荐使用网页版的在线记事本,现在这种工具很多,我选择"石墨文档"进行操作演示.记录内容的 格式可以根据自己的需求和爬虫自行 ...
- protobuf基于java和javascript的使用
目录 ProtoBuf介绍 整理下java和JavaScript的例子 demo测试 java作为服务端+客户端测试 客户端前端调用示例 项目地址 参考 ProtoBuf介绍 ProtoBuf 是go ...
- 在linux系统中登录mysql时出现Enter password: ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)的解决办法
在一次使用mysql数据库是出现了这种错误,于是乎去百度看了很多博文踩了很多坑,最终解决了问题,分享给大家. 转载与:https://blog.csdn.net/css33/article/detai ...
- JVM之调优及常见场景分析
JVM调优 GC调优是最后要做的工作,GC调优的目的可以总结为下面两点: 减少对象晋升到老年代的数量 减少FullGC的执行时间 通过监控排查问题及验证优化结果,可以分为: 命令监控:jps.jinf ...
- [源码分析] 消息队列 Kombu 之 mailbox
[源码分析] 消息队列 Kombu 之 mailbox 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Komb ...