24 星球的末日
【问题描述】
24 星球的世界末日就要到了 , 可是诺亚方舟还没有制造完成 。 为了制造诺亚
方舟这个星球上的所有国家都站在统一战线 。 现在一共有n个国家 , 一个国家到
另一个国家都有一条且仅有一条通信渠道,且这个渠道有一个距离,这样就形
成了一个有向完全图。 。 世界末日的预兆已经来了 , 世界上很多东西都在遭到不
明原因的破坏,包括这些通信渠道。现在为了联合制造出诺亚方舟,需要统计
所有国家对 (a到b和b到a是不同的 ) 之间通信最短距离之和 。( ( 例如只有两个星
球 ,a到b与b 到a的距离都是1, 则最短距离和为2。) ) 可是每隔一段时间就有一些
渠道会被破坏,现在 24 星球的首领 大龙 急需要你来解决这个问题。
【输入文件】
读入文件 destroy.in
对于每组数据 , 第一行是一个n, 表示有n个国家 , 接下来有n行 , 每有n 个 非
负 整数。第i行第j 列的数字表示国家i i 到国家j j 的通信渠道距离(距离不大于
10000 ) 。 接下来是一个数字m, 表示在可以预知的未来中会有m次破坏会施加到
通信渠道中 , 每次破坏只能破坏一条渠道 , 一条渠道可以被破坏多次, , 但是第
一次破坏这条渠道就无法再发送信息 。 接下来有m行 , 每行两个整数a、b, 表示
国家a到国家b的通信渠道遭到破坏。
【输出文件】
输出文件 destroy.out
对于每组数据 , 输出m m 行 , 第i i 行表示第i i 次破坏后对应的答案是多少 。 如果
存在两个国家无法相互到达,输出1 1 NF 。
【输入样例】
3
0 1 1
1 0 1
1 1 0
4 4
1 2
1 2
2 3
2 3
【输出样例】
7
7
8
1NF
【数据规模】
40% 的数据中 1<n<=50,1<m<=50;
100% 的数据中 1<n<=200,1<m<=200 。

————————————————————————————题解

删边有点麻烦,所以我们一次性读入m个询问,离线处理,把所有边删除,倒着加上一条条边,回溯状态

我们加上第m条边时,我们到达的就是m-1的状态,加上第m-1条边时,就是m-2询问的状态……加上第2条边时,就是1询问的状态

枚举i=1->n j=1->n 用一条边u,v更新g[i][j]=min(g[i][j],g[i][u]+val(u,v)+g[v][j]

同时因为边可能重复被删,用一个next数组记录这条边最早被删掉的时刻,样例中next[2]=1,如果next不为0,当前状态的边是无法复原的,所以直接由上一个时刻过继过来就可以了

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#include <string.h>
#include <cmath>
#define siji(i,x,y) for(int i=(x);i<=(y);++i)
#define gongzi(j,x,y) for(int j=(x);j>=(y);--j)
#define xiaosiji(i,x,y) for(int i=(x);i<(y);++i)
#define sigongzi(j,x,y) for(int j=(x);j>(y);--j)
#define inf 0x3f3f3f3f
#define ivorysi
#define mo 97797977
#define hash 974711
#define base 47
#define MAXN 30005
#define fi first
#define se second
#define pii pair<int,int>
#define eps 1e-8
typedef long long ll;
using namespace std;
int n,m;
int f[][];
int g[][];
int a[],b[],ans[],next[];
bool flag=;
void solve() {
scanf("%d",&n);
siji(i,,n) {
siji(j,,n) {
scanf("%d",&f[i][j]);
g[i][j]=f[i][j];
}
}
scanf("%d",&m);
siji(i,,m) {
scanf("%d%d",&a[i],&b[i]);
g[a[i]][b[i]]=-;
}
siji(k,,n) {
siji(i,,n) {
siji(j,,n) {
if(g[i][k]==- || g[k][j]==-) continue;
int x=g[i][k]+g[k][j];
if(g[i][j]==-) {
g[i][j]=x;
}
else {
g[i][j]=min(x,g[i][j]);
}
}
}
}
siji(i,,m) {
siji(j,i+,m) {//这里打错了一次变量名
if(a[i]==a[j] && b[i]==b[j]) {
if(next[j]==) next[j]=i;
else if(next[j] > i) next[j]=i;
}
}
}
siji(i,,n) {
siji(j,,n) {
if(g[i][j]==-) {ans[m]=-;goto s;}
ans[m]+=g[i][j];
}
}
s:
gongzi(i,m,) {
if(next[i]!=) {ans[i-]=ans[i];continue;}
/*
更新时不要直接g[a[i]][b[i]]=f[a[i]][b[i]]
因为g[a[i]][b[i]]可能小于f[a[i]][b[i]]
这样会得到错解
*/
siji(j,,n) {
siji(k,,n) { if(g[j][a[i]] == - || g[b[i]][k] == -) continue;
int x=g[j][a[i]]+f[a[i]][b[i]]+g[b[i]][k];
if(g[j][k]==-) {
g[j][k]=x;
}
else {
g[j][k]=min(g[j][k],x);
}
}
}
siji(j,,n) {
siji(k,,n) {
if(g[j][k]==-) {ans[i-]=-;goto t;}
ans[i-]+=g[j][k];
}
}
t:;
}
siji(i,,m) {
if(ans[i]==-) puts("1NF");
else {
printf("%d\n",ans[i]);
}
}
}
int main(int argc, char const *argv[])
{
#ifdef ivorysi
freopen("destroy.in","r",stdin);
freopen("destroy.out","w",stdout);
#else
freopen("f1.in","r",stdin);
#endif
solve();
return ;
}

2017冬季24集训模拟题-24星球的末日(Floyd)的更多相关文章

  1. 2017冬季24集训模拟-2.A问题

    ————————————————————————————————————————题解 唯一没有想出来的题 我们发现以上两种操作 a0,a3,a6,a9……的相对位置不变 a1,a4,a7,a10……的 ...

  2. emWin5.24 VS2008模拟LCD12864 stm32 RTX移植 【worldsing笔记】

      emWin for 12864 并口移植 源代码下载:RTX_emWin5.24_Keil_VS2008-20141122.zip   硬件环境: CPU: stm32f103ve LCD:st7 ...

  3. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem K. UTF-8 Decoder 模拟题

    Problem K. UTF-8 Decoder 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c702 ...

  4. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  5. 8.19noip模拟题

      2017 8.19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas ...

  6. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

  7. poj1472[模拟题]

    Instant Complexity Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2017   Accepted: 698 ...

  8. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  9. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

随机推荐

  1. SpringMVC之@RequestParam @RequestBody @RequestHeader 等详解

    转自:http://blog.csdn.net/kobejayandy/article/details/12690161?reload 简介: handler method 参数绑定常用的注解,我们根 ...

  2. 好的MongoDB学习文章链接

    1.MongoDB 极简实践入门 2.MongoDB中文社区 3.极客学院Mongodb 教程

  3. 即时新闻展示插件jQuery News Ticker,超级简单!

    有时候我们为了节省页面空间,会在页面明显处放一小条,用来展示比较重要的即时新闻,一般以轮播的形式出现.今天要介绍的jQuery News Ticker插件就是用来实现这个即时新闻展示功能的,效果图如下 ...

  4. R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

    一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...

  5. 训练赛第一场D题

    解题报告:一开始不知道ATA的意思,后来才知道原来是转置矩阵乘以原来的矩阵.这题说起来比较麻烦就不说了,直接上代码: #include<cstdio> #include<cstrin ...

  6. C++利用cin输入时检测回车的方法

    今天做TJU的OJ ,其中一道题是先读入一个字符串,再读入一个整数,循环往复,直到字符串是空,也就是说回车键结束循环. 但是cin对空格和回车都不敏感,都不影响继续读入数据,所以需要一种新的方式检测回 ...

  7. 利用phpMyAdmin提权

    利用phpMyAdmin提权 发表于 2016-03-31   |   分类于 phpMyAdmin  |   暂无评论  |   9次阅读 爆路径 /phpmyadmin/libraries/lec ...

  8. 2016.6.20——Plus One

    Plus One 本题收获 1.vector<int> 和vector<char>的区别,及与int转换 从vector<int> nums 转换为int res型 ...

  9. 2016.5.18——Excel Sheet Column Number

    Excel Sheet Column Number 本题收获: 1.对于字符串中字母转为ASIIC码:string s ;res = s[i]-'A'; 这个res就是数字s[i]-'A'是对ASII ...

  10. Python标准库笔记(8) — pprint模块

    struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...