题意:

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

  

思路:

        直接暴力可定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. 关于SPFA的双端队列优化

    7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...

  2. POJ——3159Candies(差分约束SPFA+前向星+各种优化)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 28071   Accepted: 7751 Descrip ...

  3. spfa + slf优化

    最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...

  4. Codeforces 938D Buy a Ticket 【spfa优化】

    用到了网络流的思想(大概).新建一个源点s,所有边权扩大两倍,然后所有的点向s连边权为点权的无向边,然后以s为起点跑spfa(S什么L优化的),这样每个点到s的距离就是答案. 原因的话,考虑答案应该是 ...

  5. hdu 1874(最短路 Dilkstra +优先队列优化+spfa)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. SPFA 的两个优化

    From NOCOW SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将 ...

  7. 【最短路径】 SPFA算法优化

    首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...

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

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

  9. SPFA的两个(卡时)优化

    SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队 ...

随机推荐

  1. HDOJ-4725(Dijikstra算法+拆点求最短路)

    The Shortest Path in Nya Graph HDOJ-4725 这题是关于最短路的问题,但是和常规的最短路有点不同的就是这里多了层次这一结构. 为了解决这一问题可以把每一层抽象或者划 ...

  2. SQL Database for Modern Developers

    好书分享,面向开发者的Azure SQL Database最佳实践,也适用SQL Server 2016以上的版本.应对不同场景使用的数据库功能,包括内存表,列存储表,非聚集列存储索引,JSON等等. ...

  3. 进阶宝典一|SqlServer数据库自动备份设置

    很多人都没机会接触到数据库备份,经常操作的要么是数据库管理员,要么是项目负责人.那是不是说数据库备份就不用学了? 不,其实作为开发人员应该要了解数据备份,数据备份的手段有很多:软件备份.脚本备份.其他 ...

  4. C# 应用 - 使用 HttpClient 发起上传文件、下载文件请求

    1. 示例代码 using System; using System.IO; using System.Net.Http; /// <summary> /// 下载文件 /// </ ...

  5. WPF 基础 - 点击事件的执行顺序及 Button 点击事件的特殊性

    1. 点击事件的执行顺序 PreviewMouseLeftButtonDown PreviewMouseDown MouseLeftButtonDown MouseDown PreviewMouseL ...

  6. 2019 GDUT Rating Contest II : Problem F. Teleportation

    题面: Problem F. Teleportation Input file: standard input Output file: standard output Time limit: 15 se ...

  7. IPFS矿机封装原理解释

    近期无论是从媒体.新闻的高度曝光,还是市场拓展的覆盖度来看,IPFS 俨然成为今年最值得关注的行业话题与入场趋势.对于许多刚了解 IPFS 的小白来说,矿机的「封装」.「有效算力」和「原值算力」这些概 ...

  8. FTT简单入门板子

    DFT : 1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include < ...

  9. 微信小程序--简约风博客小程序(基于云开发 - 全开源)

    微信小程序--简约风博客小程序(基于云开发 - 全开源) 项目启动纯属突发奇想,想看看博客小程序,例如wehalo博客小程序,但是感觉自建平台还要浪费自己的服务器算力,还没有访问量,省省吧. 本着白嫖 ...

  10. 计算机体系结构——CH4 输入输出系统

    计算机体系结构--CH4 输入输出系统 右键点击查看图像,查看清晰图像 X-mind 计算机体系结构--CH4 输入输出系统 输入输出原理 特点 实时性 与设备无关性 异步性 输入输出系统的组织方式 ...