拓扑排序:

两个队列,一个放不须要重新启动入度为0的,一个放须要重新启动入度为0的....从不须要重新启动的队列開始,每弹出一个数就更新下入度,遇到入读为0的就增加到对应队列里,当队列空时,记录重新启动次数+1,交换队列..一直到两个队列都为空

Smart Software Installer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 78    Accepted Submission(s): 32

Problem Description
The software installation is becoming more and more complex. An automatic tool is often useful to manage this process. An IT company is developing a system management utility to install a set of software packages automatically with the dependencies. They found
that reboot is often required to take effect after installing some software. A software package cannot be installed until all software packages it depends on are installed and take effect. 



In the beginning, they implemented a simple installation algorithm, but the system would reboot many times during the installation process. This will have a great impact on the user experience. After some study, they think that this process can be further optimized
by means of installing as much packages as possible before each reboot.



Now, could you please design and implement this algorithm for them to minimize the number of restart during the entire installation process?

 
Input
The first line is an integer n (1 <= n <= 100), which is the number of test cases. The second line is blank. The input of two test cases is separated by a blank line.



Each test case contains m (1 <= n <= 1000) continuous lines and each line is no longer than 1024 characters. Each line starts with a package name and a comma (:). If an asterisk (*) exists between the package name and the comma, the reboot operation is required
for this package. The remaining line is the other package names it depends on, separated by whitespace. Empty means that there is no dependency for this software. For example, “a: b” means package b is required to be installed before package a. Package names
consist of letters, digits and underscores, excluding other special symbols.



Assume all packages here need to be installed and all referenced packages will be listed in an individual line to define the reboot property. It should be noted that cyclic dependencies are not allowed in this problem.
 
Output
For each test case, you should output a line starting with “Case #: " (# is the No. of the test case, starting from 1) and containing the reboot count for this test case. (Refer to the sample format)
 
Sample Input
2 glibc:
gcc*: glibc uefi*:
gcc*:
raid_util*: uefi
gpu_driver*: uefi
opencl_sdk: gpu_drivergcc
 
Sample Output
Case 1: 1
Case 2: 2
 
Source
 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
#include <sstream>
#include <map>
#include <queue> using namespace std; const int maxn=2000; map<string,int> mSI;
int nm;
bool restart[maxn];
int degree[maxn]; int hash(string name)
{
int ret=mSI[name];
if(ret==0)
{
mSI[name]=nm++;
ret=nm-1;
}
return ret;
} struct Edge
{
int to,next;
}edge[maxn*maxn]; int Adj[maxn],Size; void init()
{
memset(Adj,-1,sizeof(Adj)); Size=0;
} void add_edge(int u,int v)
{
edge[Size].to=v; edge[Size].next=Adj[u]; Adj[u]=Size++;
} int TUOPU()
{
queue<int> q[2];
int a=0,b=1;
int n=nm-1;
for(int i=1;i<=n;i++)
{
if(degree[i]==0)
{
if(restart[i]==true) q[b].push(i);
else q[a].push(i);
}
}
int time=0;
while(!q[a].empty()||!q[b].empty())
{
while(!q[a].empty())
{
int u=q[a].front(); q[a].pop();
for(int i=Adj[u];~i;i=edge[i].next)
{
int v=edge[i].to;
degree[v]--;
if(degree[v]==0)
{
if(restart[v]==true) q[b].push(v);
else q[a].push(v);
}
}
}
if(q[b].empty()==true) continue;
time++;swap(a,b);
}
return time;
} int main()
{
int T_T,cas=1;
scanf("%d",&T_T);
getchar(); getchar();
while(T_T--)
{
init();
mSI.clear(); nm=1;
memset(restart,false,sizeof(restart));
memset(degree,0,sizeof(degree)); string line,name;
while(getline(cin,line))
{
if(line[0]==0) break;
istringstream sin(line);
sin>>name;
bool flag=false;
int sz=name.size();
if(name[sz-2]=='*')
{
flag=true;
name[sz-2]=0;
name.resize(sz-2);
}
else
{
name[sz-1]=0;
name.resize(sz-1);
} int to=hash(name);
restart[to]=flag;
while(sin>>name)
{
int from=hash(name);
add_edge(from,to);
degree[to]++;
}
}
printf("Case %d: %d\n",cas++,TUOPU());
}
return 0;
}

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

  1. 双拓扑排序 HDOJ 5098 Smart Software Installer

    题目传送门 /* 双拓扑排序:抄的,以后来补 详细解释:http://blog.csdn.net/u012774187/article/details/40736995 */ #include < ...

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

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

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

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

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

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

  5. hdoj 2647 Reward【反向拓扑排序】

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. hdu 5098 双队列拓扑排序

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

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

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

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

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

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

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

随机推荐

  1. React 第一天

    第一天 从webpack到babel再到React.js Vue是如何实现组件化的: 通过.vue文件,来创建对应的组件: ·template 结构 ·script 行为 ·style 样式 Reac ...

  2. FastDFS图片服务器搭建

    *FastDFS图片服务器搭建准备:1.需要libfastcommon安装包 选择最新稳定版(libfastcommon-1.0.36.tar.gz)2.需要FastDFS安装包 选择最新稳定版(fa ...

  3. crontab执行脚本和手动执行脚本输出结果不一致的问题处理

    背景:huskiesir最近用公司给分配的账户写了脚本去检测某应用状态并发送到企业邮箱,写完脚本之后去执行了一下,发现效果还不错,在邮箱显示效果如下: 10.11.116.6  检查结果OK,检查时间 ...

  4. 紫书 习题 8-17 UVa 11536 (滑动窗口)

    这道题说连续子序列, 马上就想到滑动窗口. 注意窗口里面的元素中小于等于k的才是有效元素.记录窗口里面有效元素的个数, 满足了之后开始 缩短窗口, 如果左端点不是有效元素或者即使窗口中存在这个元素的个 ...

  5. [luogu]P4316 绿豆蛙的归宿(拓扑排序,期望)

    P4316 绿豆蛙的归宿 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够 ...

  6. 2019年北航OO第一单元(表达式求导任务)总结

    2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...

  7. 海思 3520D 移植Qt4.5.3 一

    一.移植Qt4.5.3  1.获得 Qt4.5.3 的源码Qt4.5.3源码的原始包 qt-embedded-opensource-src-4.5.3.tar.gz 将其复制到 /opt 下,     ...

  8. spark pipeline 例子

    """ Pipeline Example. """ # $example on$ from pyspark.ml import Pipeli ...

  9. QuerySet和对象的例子 个人记录

    import osif __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE&quo ...

  10. rest_framework-认证-总结完结篇

    执行过程 APIView() Ruquest() Authentication() OrderView()APIView() def duspatch: self.initial(request) d ...