题解 CF915D 【Almost Acyclic Graph】
2024-08-31 15:35:37
这道题我第一次的想法是直接判环的数量,然而事实证明实在是太naive了。
随便画个图都可以卡掉我的解法。(不知道在想什么)
这道题的正解是拓扑排序。
朴素的想法是对所有边都跑一次拓扑,但这样$O(m(n+m))$会炸,于是可以有下面的优化。
我们找到所有入度不为零的点,然后把他们每一个都删掉一条边跑一遍拓扑排序。
那么这样就可以优化到$O(n(n+m))$了,稳得一批。
AC代码如下:
1935ms 1356kb
#include<bits/stdc++.h> using namespace std; namespace StandardIO { template<typename T>inline void read (T &x) {
x=;T f=;char c=getchar();
for (; c<''||c>''; c=getchar()) if (c=='-') f=-;
for (; c>=''&&c<=''; c=getchar()) x=x*+c-'';
x*=f;
} template<typename T>inline void write (T x) {
if (x<) putchar('-'),x*=-;
if (x>=) write(x/);
putchar(x%+'');
} } using namespace StandardIO; namespace Solve { const int N=; int n,m;
vector<int>graph[N];
int indeg[N];
queue<int>q; inline bool toposort (int n) {
int temp[N],size=;
memcpy(temp,indeg,sizeof(indeg));
while (!q.empty()) q.pop();
for (register int i=; i<=n; ++i) {
if (temp[i]==) q.push(i),size++;
}
while (!q.empty()) {
int v=q.front();q.pop();
for (register int i=; i<graph[v].size(); ++i) {
int to=graph[v][i];
temp[to]--;
if (temp[to]==) q.push(to),size++;
}
}
return size>=n;
} inline void solve () {
read(n),read(m);
for (register int i=; i<=m; ++i) {
int x,y;
read(x),read(y);
indeg[y]++;
graph[x].push_back(y);
}
for (register int i=; i<=n; ++i) {
if (indeg[i]!=) {
indeg[i]--;
if (toposort(n)) {
puts("YES");
return;
}
indeg[i]++;
}
}
puts("NO");
}
} using namespace Solve; int main () {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
solve();
}
最新文章
- Prime Generator
- iOS应用九宫格算法
- 循序渐进Python3(十)-- 3 -- SqlAlchemy
- BIEE定制化
- Radiobutton编辑
- Xcode8兼容iOS7手记-b
- vmware workstation下的虚拟Linux通过NAT模式共享上网
- WiFi密码破解CDlinux
- App 运营 推广相关
- disk.go
- 学python走过的坑一 类的实例化
- 讲一个关于paxos的故事...
- bzoj2200拓扑排序+最短路+联通块
- 关于ashrpt中行源的CPU + Wait for CPU事件深入解读
- 如何使用gradle打jar包
- Elasticsearch 版本控制
- hive-hbase-handler方式导入hive表数据到hbase表中
- leetCode题解之求二叉树每层的平均值
- html5调用摄像头实现拍照
- 抽象工厂模式(abstract)创建型模式