这道题我第一次的想法是直接判环的数量,然而事实证明实在是太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();
}

最新文章

  1. Prime Generator
  2. iOS应用九宫格算法
  3. 循序渐进Python3(十)-- 3 -- SqlAlchemy
  4. BIEE定制化
  5. Radiobutton编辑
  6. Xcode8兼容iOS7手记-b
  7. vmware workstation下的虚拟Linux通过NAT模式共享上网
  8. WiFi密码破解CDlinux
  9. App 运营 推广相关
  10. disk.go
  11. 学python走过的坑一 类的实例化
  12. 讲一个关于paxos的故事...
  13. bzoj2200拓扑排序+最短路+联通块
  14. 关于ashrpt中行源的CPU + Wait for CPU事件深入解读
  15. 如何使用gradle打jar包
  16. Elasticsearch 版本控制
  17. hive-hbase-handler方式导入hive表数据到hbase表中
  18. leetCode题解之求二叉树每层的平均值
  19. html5调用摄像头实现拍照
  20. 抽象工厂模式(abstract)创建型模式

热门文章

  1. 【原创】Linux下的ngix服务器安装步骤
  2. hiho150周 - 动态规划*
  3. oc语言的特点
  4. Thread-local storage
  5. 紫书 习题8-18 UVa 11536 (扫描法)
  6. 【转】Java集合间的相互转换
  7. dll签名两种方法
  8. SurfaceView左右滑动切换黑屏问题解决方式
  9. mfc 链接 access 2007 数据库
  10. hdoj 1719 Friend