HDU4324(拓扑排序)
2015-10-23 15:18
387 查看
#include <bits/stdc++.h> using namespace std; #define maxn 2111 #define maxm 8111111 int t, n; char mp[maxn][maxn]; struct node { int from, to, next; }edge[maxm]; int head[maxn]; int cnt; bool vis[maxn]; int indegree[maxn], outdegree[maxn]; void add_edge (int from, int to, int i) { node &e = edge[i]; e.from = from, e.to = to, e.next = head[from], head[from] = i; } int topo () { int ans = 0; queue <int> gg; while (!gg.empty ()) gg.pop (); for (int i = 0; i < n; i++) { if (!indegree[i]) gg.push (i), ans++, vis[i] = 1; } while (!gg.empty ()) { int u = gg.front (); gg.pop (); for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (vis[v]) continue; indegree[v]--; if (!indegree[v]) gg.push (v), ans++, vis[v] = 1; } } return ans; } int main () { //freopen ("in", "r", stdin); scanf ("%d", &t); int kase = 0; while (t--) { scanf ("%d", &n); printf ("Case #%d: ", ++kase); cnt = 0; memset (head, -1, sizeof head); memset (indegree, 0, sizeof indegree); memset (outdegree, 0, sizeof outdegree); memset (vis, 0, sizeof vis); for (int i = 0; i < n; i++) { scanf ("%s", mp[i]); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (mp[i][j] == '1') { add_edge (i, j, cnt++); indegree[j]++; outdegree[i]++; } } } int cnt = topo (); if (cnt != n) printf ("Yes\n"); else printf ("No\n"); } return 0; }
相关文章推荐
- tomcat安装服务和内存参数设置
- smarty笔记—常用变量
- 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板
- 斑马Zebra驱动下载
- iOS三方-MJRefresh的使用
- Oracle 查看DBLink密码方法(适用于Oracle10G以下版本)
- 自定义UIAlertView
- tomcat安装服务和内存参数设置
- Java数据结构与算法之栈
- org.springframework.dao.InvalidDataAccessApiUsageException
- 【知识点整理(Java)】Java Thread 简单使用注意点汇总(一)
- 逆向工程(一)书目列表
- 不忘初心,方得始终
- bones脚本篇 - 内置标签scroller
- Yii框架预定义的组件有哪些?
- Android Design 安卓官方设计文档中文翻译——第一部分:引导
- alibaba/fastJson的使用
- c#分割习题
- Javascript通过bind()掌控this
- jquery.cookie插件官方下载地址与使用方法