题目传送门

 /*
双拓扑排序:抄的,以后来补
详细解释: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. huawei校招测试题

    三道题两小时. 第一题,圈住所有点的长方形,很简单略过. 第二题:奇偶排序. 奇偶排序 描述: 输入若干(不超过1000个)非负整数数字,请先取出为奇数的数字按从大到小排序,再取出偶数从小到大进行排序 ...

  2. 如何删除ini文件中的内容

    1.删除子项值:::WritePrivateProfileString(分区名称, 子项名称, "", ini文件路径); 2.删除子项(名称和值):::WritePrivateP ...

  3. Spark简单集群搭建

    1. 上传spark-2.2.0-bin-hadoop2.7.tgz安装包到/home/dtouding目录下 2. 解压安装包到/bigdata/目录下,tar –zxvf spark-2.2.0- ...

  4. vue中引入字体文件

    在用vue来写一官网的时候,想引入外部字体文件,毕竟总感觉他自己的字体有点难看,在这里记录下 1.先下载字体文件所需的.ttf文件 我这里想引入的是华文行楷字体 百度后下载了一个3M多的ttf文件 2 ...

  5. p1694猴子 并查集

    有n只猴子,第一只尾巴挂在树上,剩下的n-1只,要么被其他的猴子抓住,要么抓住了其他的猴子,要么两者均有. 当然一只猴子最多抓两只另外的猴子,因为只有两只猴爪子嘛.现在给出这n只猴子抓与被抓的信息,并 ...

  6. java在某个日期上添加n天的方法实现

    //得到添加n天后的时间字符串 public String getAddDate(Date date,int n){ //格式转换 SimpleDateFormat sdf = new SimpleD ...

  7. CA服务器的搭建

    CA (Certification Authority) 是认证机构的国际通称,它是对数字证书的申请者发放.管理.取消数字证书的机构.CA的作用是检查证书持有者身份的合法性,并签发证书(用数学方法在证 ...

  8. 子元素margin带动父元素拖动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. hdu(1007) 最近点对 分治法

    最近点对一般想到枚举  ,一一枚举时间复杂度为n^2:枚举时候一些操作是多余的,有了分治算法的思想 ,把一些问题分个击破,再回到整体. 题目链接 以这道题为例,我们可以把他按照x轴的升序分成多个子区域 ...

  10. 屏幕适配-使用autoLayout

    当遇见xib中无法删除的控件时. 将这个错误的控件拖离本xib(第一个元素.xib文件是有许多元素组成的集合),确保这个xib是正确的.重新创建一个xib文件,将这个正确的xib元素整个复制过去. 在 ...