双拓扑排序 HDOJ 5098 Smart Software Installer
/*
双拓扑排序:抄的,以后来补
详细解释: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的更多相关文章
- HDOJ 5098 Smart Software Installer 拓扑排序
拓扑排序: 两个队列,一个放不须要重新启动入度为0的,一个放须要重新启动入度为0的....从不须要重新启动的队列開始,每弹出一个数就更新下入度,遇到入读为0的就增加到对应队列里,当队列空时,记录重新启 ...
- hdu 5098 双队列拓扑排序
http://acm.hdu.edu.cn/showproblem.php?pid=5098 软件在安装之后需要重启才能发挥作用,现在给你一堆软件(有的需要重启有的不需要)以及安装这个软件之前需要哪些 ...
- hdu 3342 Legal or Not(拓扑排序) HDOJ Monthly Contest – 2010.03.06
一道极其水的拓扑排序……但是我还是要把它发出来,原因很简单,连错12次…… 题意也很裸,前面的废话不用看,直接看输入 输入n, m表示从0到n-1共n个人,有m组关系 截下来m组,每组输入a, b表示 ...
- hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】
Triangle LOVE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- HDOJ 1285 确定比赛名次(拓扑排序)
Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...
- 拓扑排序/DFS HDOJ 4324 Triangle LOVE
题目传送门 题意:判三角恋(三元环).如果A喜欢B,那么B一定不喜欢A,任意两人一定有关系连接 分析:正解应该是拓扑排序判环,如果有环,一定是三元环,证明. DFS:从任意一点开始搜索,搜索过的点标记 ...
- HDOJ 2647 Reward 【逆拓扑排序+分层】
题意:每一个人的基础工资是888. 因为一部分人要显示自己水平比較高,要求发的工资要比其它人中的一个人多.问你能不能满足他们的要求,假设能的话终于一共要发多少钱,假设不能就输出-1. 策略:拓扑排序. ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- 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. ...
随机推荐
- 利用BADI WORKORDER_INFOSYSTEM在COOIS中加入自己定义列办事处
需求描写叙述:依据LC业务部门提出的需求.须要在COOIS中加入办事处一列. 1.在IOHEADER_TAB的CI_IOHEADER中加入字段办事处.如以下图所看到的: watermark/2/t ...
- HashMap存入大量数据是否要预定义存储空间
按说HashMap的负载极限为0.75,可是,测试程序并看不出这个结果.待探讨 测试程序如下: 根据结果看不出来预定义有什么影响. public class test { public static ...
- quilt
1 什么是quilt quilt是一个patch管理工具,特别适合于对多个patch进行管理. quilt是基于gnu patch和diff的. 2 使用quilt创建一个patch 第一步,quil ...
- webservice client setTimeOut
一:eclipse生成的client,基于axis client_sub.getOptions().setTimeOutInMilliSeconds(1000*60); client_sub表示一个客 ...
- 【c++】map 迭代器删除演示样例
C++ STL中的map是很常见的.通常我们用例如以下方式来遍历,而且删除map中的一些entry: map<int, int> mp; mp.insert(make_pair(1,1)) ...
- 一步一步学Silverlight 2系列(10):使用用户控件
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Linux:外网域名防火墙设置导致下载失败
问题现象: 通过IE从服务器下载文件时,提示Can't read from connection: Connection reset by peer. 别的现场都是好的,只有该现场有这个问题.所以,一 ...
- CodeForces19D:Points(线段树+set(动态查找每个点右上方的点))
Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coo ...
- liunx命令之【查看某个端口号的使用情况】
第一:查看端口占用情况的命令:lsof -i:<端口号>
- MYSQL数据库学习----查询
查询语句是MYSQL数据库中用到的最多的语句. 查询语句分为几种 单表查询 集合函数查询 连接查询 子查询 合并查询 正则表达式查询 一:单表查询 SELECT 属性 FROM 表名 [WHERE 查 ...