CF1411C - Peaceful Rooks | 思维
在一个
的棋盘上有 个棋子。若棋子处于同一行或同一列便认为他们可以互相攻击。初始时棋子之间均不可互相攻击。你可以进行若干次操作,每次操作可以将棋子纵向移动任意格或横向移动任意格,要求移动之后棋子之间不能互相攻击。求使得棋子均处在主对角线上的最小操作次数。
这道题本该很简单,但当时想的时候一如既往的失了智,导致做得很慢。
我们先考虑纵向移动的情况,一颗棋子
那么横向移动的情况呢,可以发现是建反向边,和纵向移动一样,两种移动方式我们采取一种即可。
当时的思路是很混乱的,只想到第一层,就是一个环或者一条链的情况,然后各种判断,果然还是一叶障目了。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int edg[100005]; bool vis[100005]; int dfs(int u) { if (u == 0) return 0; if (vis[u]) return u; vis[u] = true; return dfs(edg[u]); } int main() { int T = 0; scanf("%d", &T); for (int G = 1; G <= T; G++) { int n = 0, m = 0, ans = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) edg[i] = 0, vis[i] = false; for (int i = 1; i <= m; i++) { int x = 0, y = 0; scanf("%d%d", &x, &y); if (x != y) ans++; edg[x] = y; } for (int i = 1; i <= n; i++) { if (edg[i] == 0 || edg[i] == i) continue; if (!vis[i]) { if (dfs(i) == i) ans++; } } printf("%d\n", ans); } return 0; }
标签:
思维
, codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具