题意:

          删除每一条边求最短路的和,每删除一个就输出一个和.

  

思路:

        直接暴力可定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]优化相关推荐

  1. POJ 3621 Sightseeing Cows(最优比率环+spfa的dfs判环优化)

    题目链接 题目大意:给你一个有向图,每个点都有一个权值,每条边都有一个长度,需要找到一个各点权值和/各边长度和 最大的环出来,输出这个比值. 分析:假设结点权值为wiw_iwi​,边的长度为lil_i ...

  2. SPFA的SLF与LLL优化

    SPFA算法的优化有两个:SLF与LLL,这两个优化都是利用deque进行的. 1.SLF(Small Label First):为了方便,把新加入的顶点记为v,队首记为u.每次进队时如果dist[v ...

  3. SPFA算法的四种优化(SLF,LLL,SLF+LLL,DFS)

    文章目录 1 基本介绍 2 基础SPFA算法 3 SLF优化 4 LLL优化 5 SLF+LLL优化 6 DFS优化 1 基本介绍 若读者还不太了解SPFA算法,指路一篇博客:https://blog ...

  4. 【题解】P1979 [NOIP2013 提高组] 华容道(SPFA,BFS,常数优化)

    [题解]P1979 [NOIP2013 提高组] 华容道 最近打比赛次次挂..平均每周得被至少一场比赛打击一次(这周好不容易 ABC 打的还行模拟赛又挂--)心烦意乱.写篇题解疏散一下内心的苦闷(雾) ...

  5. 贝尔曼算法队列优化(SPFA)

    最短路问题 想必大家接触图论的时候,结束了DFS和BFS,接下来就是求最短路了吧!在学SPFA之前,你也许已经接触过弗洛伊德算法和迪杰斯特拉算法,甚至还学过贝尔曼算法,然而,不管你以前学过什么,今天的 ...

  6. 道路与航线(spfa+deque优化)

    农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航线 (编号为1到P) 连接. 每条道路 i 或者航 ...

  7. 队列优化dijsktra(SPFA)的玄学优化

    转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2​ 优化 对一些数 ...

  8. AcWing 342. 道路与航线 (连通块Dijkstra+拓扑序||spfa+slf优化)

    整理的算法模板:ACM算法模板总结(分类详细版) 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航 ...

  9. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)

    Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高.而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编 ...

最新文章

  1. 不会代码,如何搭建一个个人博客?
  2. idea 启动 springBoot debug很慢,正常启动很快是什么原因
  3. 视频AI,助力体育赛事转播走进智能时代
  4. 本周leetcode刷题总结!(二叉树)
  5. 定时器和for循环数组_59.for循环遍历数组、集合(含代码)
  6. C51红外接收与发射控制及原理编码与解码
  7. 海风的Linux开发环境介绍
  8. Enigma Sim-英格玛密码机模拟器
  9. easyui treegrid
  10. python爬虫课设-爬取3000条数据并做数据可视化
  11. python一个强大的编程软件零基础也可以学习
  12. 【华为OD机试 2023】 数组合并(C++ Java JavaScript Python)
  13. arduino驱动LD3320语音识别模块
  14. 苹果iPhone5 16G长沙九方现货售8199元
  15. 计算机二级考试地点没有容量,2017年计算机二级office考试点积累
  16. 无源互调分析仪PIM Analyzer原理及应用
  17. 奶茶杯-市场现状及未来发展趋势
  18. 通过matlab进行绩效,浅谈matlab在企业人力资源绩效评价体系中的应用
  19. Android适配--最详细的限定符屏幕适配方案解析 附带values-Dimens文件生成工具
  20. JavaEE 之 Habernate

热门文章

  1. 将一个数组划分为和差值最小的子数组
  2. 安全问题-携程可能摊上大事了——崩溃原因分析
  3. Unable to find the ncurses libraries or the required header files解决
  4. 1012: [JSOI2008]最大数maxnumber 线段树
  5. rabbitmq 一些基本函数介绍
  6. BZOJ 1003 物流运输trans dijstra+dp
  7. 将方法定义在prototype上的好处
  8. jQuery 图片剪裁插件初探之 Jcrop
  9. 关系数据库范式粗略理解
  10. ascx页面获取标签的通用方法