题目传送门

 /*
双拓扑排序:抄的,以后来补
详细解释: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
*/

最新文章

  1. java web学习总结(二十六) -------------------JSP属性范围
  2. JQuery操作类数组的工具方法
  3. React Ajax
  4. Web的Ajax应用开发模式(一)——了解Ajax的使用形式
  5. 09 高效的PL/SQL程序设计
  6. CentOS 6.5下安装Zabbix 2.2.x
  7. Linux Shell编程(22)——时间/日期 命令
  8. phpexcel 一些基本的设置 (表格的基本属性)
  9. C#窗体实现文件拖拽功能
  10. js设计模式
  11. 程序启动报错:ORA-12505;PL/SQL却可以登录的解决方法
  12. OSPF相关知识与实例配置【第一部分】
  13. Struts2 源码剖析 控制部分-----1
  14. 配置maven和maven本地仓库
  15. Angular中的服务的使用
  16. pyaudio
  17. PowerDesigner逆向生成MYSQL数据库表结构总结
  18. Flutter 控件之 Routes 和 Navigator. [PopupRoute]
  19. 1.HTML初识
  20. Oracle 11g服务器安装详细步骤——图文教程(系统 windows server 2012 R2)

热门文章

  1. 键盘HOOK显示按键信息
  2. DT的jquery
  3. Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序,贪心
  4. Python 中的字节与字节数组
  5. DDD领域建模基本流程
  6. mysql---列的选取原则
  7. javascript:;用法集锦
  8. 织梦系统如何设置URL绝对路径及绝对路径的好处
  9. 关于python代码的性能
  10. OpenMediaVault GitLab 安装