D:AtCoder Grand Contest 012 Splatter Painting

题目描述

Squid喜欢在图中为一些顶点染色(毕竟是鱿鱼 )

现在有一张由 N 个顶点和 M 条边组成的简单无向图,其中顶点编号为1到 N。我们用数字来编号各种颜
色。
一开始,所有的顶点都会被染成颜色0 。第 i 条双向边连接着两个端点a[i] 和 b[i]。每条边的长度都是单位1。

Squid 会在这张图上进行Q 次操作。其中对于第 i次操作,他(它???)会将与顶点 v[i] 相距 d[i] (包括v[i] )的所有点重新染色成颜色c[i].

请问 Q 次操作后,每个顶点的颜色各是什么。

输入格式

N M
a1 b1
:
aM bM
Q
v1 d1 c1
:
vQ dQ cQ

输出格式

答案一共 N 行。在第 i 行中,在Q 操作之后输出顶点 i 的颜色。

因为已染色的点不再重复染色,所以从第 Q 次操作往前模拟,每次操作如果找到的点已被染色就不再重复染,并考虑若已经处理过从v点出发而d更大的染色操作,则这一次操作必定无效,可以return掉。

code:

#include <bits/stdc++.h>
#define sc(x) scanf("%d", &x)
#define pr(x) printf("%d\n", x)
#define lowbit(x) (x & -x)
#define ll long long
#define N 100010
using namespace std;
int n, m, col[N], tot = 0, head[N], maxx[N], q;
struct Xiao
{int next, to;
}e[N * 2];
struct Wang
{int v, d, c;
}qvq[N];
inline void add(int x, int y)
{e[++tot].next = head[x];e[tot].to = y;head[x] = tot;
}
inline void dfs(int d, int sc, int x, int fa)
{if (d <= maxx[x]) return;maxx[x] = d;if (col[x] == 0) col[x] = sc;for (int i = head[x]; i; i = e[i].next){int y = e[i].to;if (y == fa) continue;dfs(d - 1, sc, y, x);}
}
int main()
{sc(n);sc(m);for (int i = 1; i <= m; i++){int a, b;sc(a);sc(b);add(a, b);add(b, a);}sc(q);for (int i = 1; i <= q; i++){sc(qvq[i].v);sc(qvq[i].d);sc(qvq[i].c);}memset(maxx, -1, sizeof maxx);for (int i = q; i >= 1; i--)dfs(qvq[i].d, qvq[i].c, qvq[i].v, 0);for (int i = 1; i <= n; i++)printf("%d\n", col[i]);return 0;
}

E:codeforces 567 E President and Roads

题目大意

有 n 个点,m 条边,询问每一条边是否在 S —T 最短路上,如果一定在最短路上,输出 YES ;如果边权减去 x 后一定在最短路上,则输出 CAN x,(边权不能变成非正数);如果一定无法在最短路上则输出NO

输入格式

第一行给四个数 n, m, S, T 接下来 m 行每行 a, b, l表示 a 和 b 之间有一个长为 l 的边

输出格式

m 行,第 i 行为第 i 条边的情况

dijkstra + tarjan判割边

从起点终点分别出发做一遍最短路,判断一下每一条边是否在最短路上,重新构图,判割边

枚举每一条边,如果为割边,直接输出YES

否则,如果是在最短路上,且边长>1,输出CAN 1

若边长<=1,输出NO

如果不是在最短路上,就让这条边减小,使它在最短路上,如果边权能为正数,输出CAN x,否则输出NO

code

#include <bits/stdc++.h>
#define sc(x) scanf("%d", &x)
#define pr(x) printf("%d\n", x)
#define lowbit(x) (x & -x)
#define ll long long
#define N 200010
using namespace std;
int tot = 0, tott = 0, head[N][3], vis[N], dfn[N], low[N], n, m, s, t;
int num = 0, p[N];
ll d[2][N];
bool br[N];
struct Xiao
{int next, to, w;
}e[2][N * 2];
struct Wang
{int x, y, z;
}er[N];
inline void add1(int x, int y, int z)
{e[0][++tot].next = head[x][0];e[0][tot].to = y;e[0][tot].w = z;head[x][0] = tot;
}
inline void add2(int x, int y, int z)
{e[1][++tott].next = head[x][1];e[1][tott].to = y;e[1][tott].w = z;head[x][1] = tott;
}
inline void dijkstra(int k)
{priority_queue < pair <ll, int> > q;while (q.size()) q.pop();memset(d[k], 0x3f, sizeof d[k]);memset(vis, 0, sizeof vis);if (k == 0) {d[0][s] = 0;q.push(make_pair(0, s));}else{d[1][t] = 0;q.push(make_pair(0, t));}while (q.size()){int x = q.top().second;q.pop();vis[x] = 1;for (int i = head[x][k]; i; i = e[k][i].next){int y = e[k][i].to;int z = e[k][i].w;if (vis[y]) continue;if (d[k][y] > d[k][x] + z){d[k][y] = d[k][x] + z;q.push(make_pair(-d[k][y], y));}}}
}
inline void tarjan(int x, int eg)
{dfn[x] = low[x] = ++num;for (int i = head[x][0]; i; i = e[0][i].next){int y = e[0][i].to;if (!dfn[y]){tarjan(y, i);low[x] = min(low[x], low[y]);if (low[y] > dfn[x]) br[i] = br[i ^ 1] = true;}else{if (i != (eg ^ 1)) low[x] = min(low[x], dfn[y]);}}
}
int main()
{sc(n);sc(m);sc(s);sc(t);for (int i = 1; i <= m; i++){int x, y, z;sc(x);sc(y);sc(z);er[i].x = x;er[i].y = y;er[i].z = z;add1(x, y, z);add2(y, x, z);}dijkstra(0);dijkstra(1);tot = 1;memset(head, 0, sizeof head);for (int i = 1; i <= m; i++){if (d[0][er[i].x] + d[1][er[i].y] + er[i].z == d[1][s]){add1(er[i].x, er[i].y, er[i].z);add1(er[i].y, er[i].x, er[i].z);p[i] = tot;}}memset(br, false, sizeof br);memset(dfn, 0, sizeof dfn);for (int i = 1; i <= n; i++)if (!dfn[i]) tarjan(i, 0);for (int i = 1; i <= m; i++){if (br[p[i]]) printf("YES\n");else{if (d[0][er[i].x] + d[1][er[i].y] + er[i].z == d[1][s]){if (er[i].z > 1) printf("CAN 1\n");else printf("NO\n");}else{ll dis = d[0][t] - d[0][er[i].x] - d[1][er[i].y] - 1;if (dis <= 0) printf("NO\n");else printf("CAN %lld\n", er[i].z - dis);}}}return 0;
}

F:codeforces 1205 B Shortest Cycle

已知 n 个整数a1, a2,…,an 。考虑为图上的 n个节点,其中 i,j (i != j )相互连接仅当ai & aj != 0 时,其中& 表示按位与运算。

求出这个图中最短环的长度,如果没有环,输出-1 。

由数据范围可以知道,ai的二进制最多有64位,那么根据鸽巢原理,如果有>128个数不为0,那么必定有三个数与运算后不等于0,直接输出3

否则建图,用Floyd求最小环

code

#include <bits/stdc++.h>
#define sc(x) scanf("%d", &x)
#define pr(x) printf("%d\n", x)
#define lowbit(x) (x & -x)
#define ll long long
#define N 100010
#define memset(x) memset(x, 0, sizeof(x))
using namespace std;
int minn, cnt, dis[250][250], mp[250][250], n;
ll a[N];
int inf = 1e8 + 10;
inline void build()
{for (int i = 1; i <= cnt; i++)for (int j = 1; j <= cnt; j++)if (i != j) mp[i][j] = dis[i][j] = inf;for (int i = 1; i <= cnt; i++)for (int j = i + 1; j <= cnt; j++)if (a[i] & a[j]) mp[i][j] = mp[j][i] = dis[i][j] = dis[j][i] = 1;
}
inline void floyd()
{minn = inf;for (int k = 1; k <= cnt; k++){for (int i = 1; i < k; i++)for (int j = i + 1; j < k; j++)minn = min(minn, dis[i][j] + mp[i][k] + mp[k][j]);//更新k点之前枚举ij求经过ijk的最小环for (int i = 1; i <= cnt; i++)for (int j = 1; j <= cnt; j++)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);//更新k点}
}
int main()
{sc(n);cnt = 0;ll x;for (int i = 1; i <= n; i++){scanf("%lld", &x);if (x != 0) a[++cnt] = x;}if (cnt >= 130) printf("3\n");else{build();floyd();if (minn > n) puts("-1");else printf("%d\n", minn);}return 0;
}

G:codeforces gym 101257 F ISlands II

给出一个n*m的地图,上面相同数字的代表一个国家,问对于每个国家有多少个国家在它内部(即被包围)。例如第一个样例,1包围2,2包围3,所以1包围2和3,2包围3。

对于每一个点,如果它下面的那个点和右边的点与它颜色不同,就以颜色为节点连边,在最外面再加一圈0

如果一个点为割点,它的子树中的节点一定在它内部

code

#include <bits/stdc++.h>
#define sc(x) scanf("%d", &x)
#define pr(x) printf("%d\n", x)
#define lowbit(x) (x & -x)
#define ll long long
#define N 1000010
using namespace std;
int tot = 0, head[N], size[N], low[N], dfn[N], n, m;
int v[N], ans[N], cnt = 0, num = 0, a[1010][1010], v1[N];
struct Xiao
{int next, to;
}e[N * 8];
inline void add(int x, int y)
{e[++tot].next = head[x];e[tot].to = y;head[x] = tot;
}
inline void dfs(int x)
{size[x] = 1;if (x > cnt) cnt = x;v[x] = 1;for (int i = head[x]; i >= 0; i = e[i].next){int y = e[i].to;if (v[y]) continue;dfs(y);size[x] += size[y];}
}
inline void tarjan(int x, int fa)
{dfn[x] = low[x] = ++num;v1[x] = 1;for (int i = head[x]; i >= 0; i = e[i].next){int y = e[i].to;if (y == fa) continue;if (!dfn[y]){tarjan(y, x);low[x] = min(low[x], low[y]);if (low[y] >= dfn[x]) ans[x] += size[y];}else if (v1[y]) low[x] = min(low[x], dfn[y]);}
}
int main()
{sc(n);sc(m);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)sc(a[i][j]);memset(head, -1, sizeof head);for (int i = 0; i <= n; i++)for (int j = 0; j <= m; j++){if (a[i][j] != a[i + 1][j]) add(a[i][j], a[i + 1][j]), add(a[i + 1][j], a[i][j]);if (a[i][j] != a[i][j + 1]) add(a[i][j], a[i][j + 1]), add(a[i][j + 1], a[i][j]);}dfs(0);tarjan(0, -1);for (int i = 1; i <= cnt; i++)printf("%d ", ans[i]);return 0;
}

2019.11.2图论专题(AtCoder Splatter Painting、President and Roads、Shortest Cycle、ISlands II)相关推荐

  1. AtCoder Grand Round 012B Splatter Painting

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. AtCoder2362 - Splatter Painting - DFS+思维

    1.题目描述: B - Splatter Painting Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem St ...

  3. 图论专题-学习笔记:虚树

    图论专题-学习笔记:虚树 1. 前言 2. 详解 2.1 虚树定义 2.2 虚树构造 2.3 例题 3. 总结 4. 参考资料 1. 前言 虚树,主要是用于一类树上问题,这类问题通常是需要取一些关键点 ...

  4. AT2362 [AGC012B] Splatter Painting(思维、dfs染色、剪枝)

    AT2362 [AGC012B] Splatter Painting 题意 给一个n个点m条边的无向图,有q次操作 第i次操作,给出v,d,c,把所有到点v的距离不超过d的点都染上颜色c 问最后每个点 ...

  5. EOJ Monthly 2019.11 E. 数学题(反演 + 杜教筛 + 拉格朗日插值)

    EOJ Monthly 2019.11 ∑i=1n∑a1=1i∑a2=1i∑a3=1i⋯∑ak−1i∑aki[gcd(a1,a2,a3,-,ak−1,ak,i)==1]=∑i=1n∑d∣iμ(d)⌊i ...

  6. .[算法]图论专题之最短路径

    .[算法]图论专题之最短路径 作者:jasonkent27 转载请注明出处:www.cnblogs.com/jasonkent27 1. 前言 1.1 最短路引入 小明和小天现在住在海口(C1),他们 ...

  7. 2019.11.28

    2019.11.28 % 滑动平均(均值滤波) sliding_window = 5; impulse_fft_tmp = impulse_fft_6k; for i = 1+sliding_wind ...

  8. 2019.11.10

    2019.11.10 wf = wave.open(file_name, 'wb') # wf = wave.open("sine.wav", 'wb') wf.setnchann ...

  9. 2019.11.13

    2019.11.13 wf = wave.open(file_name, 'wb') # wf = wave.open("sine.wav", 'wb') wf.setnchann ...

最新文章

  1. 【敬初学者】Python基础学完了,该怎么知道自己学的怎么样呢?十个经典实战小项目附源码
  2. 2假动作,数据缓冲,CCEaseExponential,CCEaseElastic,CCEaseBounce,CCCallFunc,funcNCallBack,funcNDCallBack,funcO
  3. Today's my MDX...
  4. 分布式部署_Apache Spark探秘:三种分布式部署方式比较
  5. python成长之路【第七篇】:面向对象
  6. 修改centos6.5的时区
  7. Android怎么禁用底部键,在三分钟内完全禁用并隐藏Android设备底部的虚拟按钮(适用于测试)...
  8. yum 崩溃的解决方法
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述...
  10. GB2312 一二级中文汉字字库(带拼音)
  11. MT4跟单系统如何查询交易品种的合约规格?
  12. Qt优秀开源项目之十四:SortFilterProxyModel
  13. Edge,IE浏览器 兼容模式设置
  14. Eclipse如何调试代码
  15. 651被远程计算机关闭,win7宽带连接提示错误651调制解调器报告了一个错误怎么办...
  16. 学计算机20天培训心得体会学生,信息技术2.0培训心得总结3篇
  17. 如何使用报表工具设置页眉与页脚
  18. ubuntu系统的文件权限获取
  19. 推荐九个数据可视化工具,快速生成可视化信息
  20. 三步教会您如何才能快速学会CNC数控编程

热门文章

  1. 乘法器——booth编码
  2. JAVA 导出Excel 单元格合并
  3. 我的HackerOne漏洞赏金平台漏洞挖掘流程
  4. Two Arrays
  5. sqlserver快捷键设置
  6. 国际会计准则IAS 和 IFRS
  7. 好家伙!六成大学生认为自己毕业10年内会年入百万!看来是我格局小了。。...
  8. 在公共Wi-Fi上保持安全的12种方法
  9. 如何用JS刷新当前页面
  10. java Date.getDay()