题目传送门

 /*
双拓扑排序:抄的,以后来补
详细解释:http://blog.csdn.net/u012774187/article/details/40736995
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <ctime>
#include <cstdlib>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll; const int MAXN = 1e3 + ;
const int INF = 0x3f3f3f3f;
const double PI = acos (-1.0);
const double EPS = 1e-;
struct Edge
{
int v, nxt;
}e[MAXN * MAXN];
int in[MAXN], out[MAXN];
int re[MAXN], head[MAXN];
bool vis[MAXN];
map<string, int> M;
vector<int> G[MAXN];
int ecnt, cnt; int TopoSort(void)
{
queue<int> Q1, Q2; //Q1 !re Q2 re
for (int i=; i<=cnt; ++i)
{
if (!in[i])
{
if (!re[i]) Q1.push (i);
else Q2.push (i);
}
} int ans = ;
while (!Q1.empty () || !Q2.empty ())
{
if (Q1.empty () && !Q2.empty ()) //重启
{
ans++;
while (!Q2.empty ()) //所有都重启安装
{
Q1.push (Q2.front ()); Q2.pop ();
}
}
while (!Q1.empty ())
{
int u = Q1.front (); Q1.pop ();
vis[u] = true;
for (int i=head[u]; i!=-; i=e[i].nxt)
{
int v = e[i].v;
if (!(--in[v]))
{
if (!re[v]) Q1.push (v);
else Q2.push (v);
}
}
}
} return ans;
} void init(void)
{
M.clear ();
ecnt = cnt = ;
memset (in, , sizeof (in));
memset (out, , sizeof (out));
memset (re, , sizeof (re));
memset (head, -, sizeof (head));
memset (vis, false, sizeof (vis));
} void add_edge(int u, int v)
{
e[ecnt].nxt = head[u];
e[ecnt].v = v;
head[u] = ecnt++;
} int main(void) //HDOJ 5098 Smart Software Installer
{
//freopen ("I.in", "r", stdin); string s;
char name[];
int n, cas = ; scanf ("%d", &n); getchar (); getchar ();
while (n--)
{
init ();
while (getline (cin, s))
{
if (s[] == '\0') break;
istringstream sin (s);
sin >> name;
int len = strlen (name); int flag = ;
if (name[len-] == '*') {flag = ; name[len-] = '\0';}
else name[len-] = '\0'; string u = name, v;
if (M.find (u) == M.end ())
M[u] = ++cnt;
re[M[u]] = flag; while (sin >> v)
{
if (M.find (v) == M.end ())
M[v] = ++cnt;
add_edge (M[v], M[u]);
out[M[v]]++;
in[M[u]]++;
}
}
printf ("Case %d: %d\n", ++cas, TopoSort ());
} return ;
} /*
Case 1: 1
Case 2: 2
*/

双拓扑排序 HDOJ 5098 Smart Software Installer的更多相关文章

  1. HDOJ 5098 Smart Software Installer 拓扑排序

    拓扑排序: 两个队列,一个放不须要重新启动入度为0的,一个放须要重新启动入度为0的....从不须要重新启动的队列開始,每弹出一个数就更新下入度,遇到入读为0的就增加到对应队列里,当队列空时,记录重新启 ...

  2. hdu 5098 双队列拓扑排序

    http://acm.hdu.edu.cn/showproblem.php?pid=5098 软件在安装之后需要重启才能发挥作用,现在给你一堆软件(有的需要重启有的不需要)以及安装这个软件之前需要哪些 ...

  3. hdu 3342 Legal or Not(拓扑排序) HDOJ Monthly Contest – 2010.03.06

    一道极其水的拓扑排序……但是我还是要把它发出来,原因很简单,连错12次…… 题意也很裸,前面的废话不用看,直接看输入 输入n, m表示从0到n-1共n个人,有m组关系 截下来m组,每组输入a, b表示 ...

  4. hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  5. HDOJ 1285 确定比赛名次(拓扑排序)

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...

  6. 拓扑排序/DFS HDOJ 4324 Triangle LOVE

    题目传送门 题意:判三角恋(三元环).如果A喜欢B,那么B一定不喜欢A,任意两人一定有关系连接 分析:正解应该是拓扑排序判环,如果有环,一定是三元环,证明. DFS:从任意一点开始搜索,搜索过的点标记 ...

  7. HDOJ 2647 Reward 【逆拓扑排序+分层】

    题意:每一个人的基础工资是888. 因为一部分人要显示自己水平比較高,要求发的工资要比其它人中的一个人多.问你能不能满足他们的要求,假设能的话终于一共要发多少钱,假设不能就输出-1. 策略:拓扑排序. ...

  8. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  9. POJ 2762 Going from u to v or from v to u? (强连通分量缩点+拓扑排序)

    题目链接:http://poj.org/problem?id=2762 题意是 有t组样例,n个点m条有向边,取任意两个点u和v,问u能不能到v 或者v能不能到u,要是可以就输出Yes,否则输出No. ...

随机推荐

  1. Highmaps的天津地图数据JSON格式

    Highmaps的天津地图数据JSON格式 Highmaps的天津地图数据JSON格式 下载链接: http://pan.baidu.com/s/1eQgxECU password: tjmj 天津地 ...

  2. JAVA学习第十九课(java程序的异常处理 (二))

    异常处理的捕捉形式: 这是能够对异常进行针对性处理的方式 六.try.catch的理解 详细格式: try { //须要被检測异常的代码 } catch(异常类 变量)//改变量用于接受发生异常的对象 ...

  3. Region Range

    三篇文章了解 TiDB 技术内幕 - 说存储| PingCAP https://pingcap.com/blog-cn/tidb-internal-1/ 对于一个 KV 系统,将数据分散在多台机器上有 ...

  4. Zed Shaw:一位老程序员的建议

    Advice from an Old Programmer 原文:Zed Shaw,译文:外刊IT评论 导读:原文作者Zed Shaw是一位作家.软件开发人员.音乐人(下文中提到吉他手),于2010年 ...

  5. 创建Material Design风格的Android应用--应用主题

    本人全部文章首先公布于个人博客,欢迎关注,地址:http://blog.isming.me 昨天正式公布了android 5,同一时候android developer站点也更新了,添加了创建Mate ...

  6. (28)java web的hibernate使用

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  7. Swift(二)控制流

    要处理条件逻辑,使用 if 和 switch ,要处理循环逻辑,使用 for-in, for, while, 和 do-while .包着条件或者循环的括号可加可不加.处理逻辑体的花括弧是必须加的. ...

  8. STL Algorithms 之 unique

    C++的文档中说,STL中的unique是类似于这样实现的: template <class ForwardIterator> ForwardIterator unique ( Forwa ...

  9. python中PIL.Image和OpenCV图像格式相互转换

    PIL.Image转换成OpenCV格式: import cv2 from PIL import Image import numpy image = Image.open("plane.j ...

  10. 「网络流24题」「Codevs1237」 餐巾计划问题

    1237 餐巾计划问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond   题目描述 Description 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相 ...