HDU 5098 Smart Software Installer(拓扑排序)
来源:互联网 发布:c语言清屏函数 编辑:程序博客网 时间:2024/05/16 15:48
题目:Smart Software Installer
题意:要安装一些软件,有些软件安装完就能生效,有些需要重启。有些软件甚至要需要其它一些软件生效的情况下才能安装。
要求安装完所有软件并且全部生效的最少重启次数。
对于需要重启的软件,在它的名字后面跟着个*,冒号后面表示它所依赖的软件名称。
我们可以根据依赖关系构建有向图,比如A依赖B的话,就构造B->A,题目保证不存在环。
那么我们就可以保存好入度,用一个队列表示当前可以安装的软件;
一开始将入度为0的放进队列,逐个拿出来安装,如果需要重启,先保存起来,不需要重启的就将它指向的点全部入度减1,遇到入度变成0的就加入队列。
当队列为空时,就把那些需要重启的全部重启一下,其实就是扩展一遍,这样队列可能就会有新的软件可以安装。
这样直到全部安装完生效就可以了。
#include<cstdio>#include<cstring>#include<string>#include<map>#include<queue>#include<vector>#include<stack>using namespace std;map<string,int> MP;stack<int> ST;const int N = 1100;char ss[N], s[N];int T, t, m, in[N];bool mk[N];vector<int> V[N];int getid(){ if(!MP.count(s)){ MP[s] = ++m; V[m].clear(); } return MP[s];}void solve(){ int ans = 0, cnt = m; queue<int> Q; for(int i=1; i<=m; i++){ if(!in[i]) Q.push(i); } while(cnt){ while(!Q.empty()){ int x=Q.front(); Q.pop(); if(mk[x]) ST.push(x); else{ cnt--; for(int i=0; i<V[x].size(); i++){ int j = V[x][i]; if(!(--in[j])) Q.push(j); } } } if(!cnt) break; ans++; while(!ST.empty()){ int x = ST.top(); ST.pop(); cnt--; for(int i=0; i<V[x].size(); i++){ int j = V[x][i]; if(!(--in[j])) Q.push(j); } } } printf("Case %d: %d\n", ++t, ans);}void init(){ MP.clear(); m = 0; memset(mk, 0, sizeof(mk)); memset(in, 0, sizeof(in));}void insert(){ int len = strlen(ss); bool flag = 0; int i, j; for(i=0; i<len; i++){ if(ss[i]=='*'){ flag = 1; s[i] = '\0'; break; } if(ss[i]==':'){ s[i] = '\0'; break; } s[i] = ss[i]; } int x = getid(); mk[x] |= flag; for(i+=2, j=0; i<len; i++){ if(ss[i]==' '){ s[j] = '\0'; int y = getid(); V[y].push_back(x); in[x]++; j = 0; } else{ s[j++] = ss[i]; } } s[j] = '\0'; int y = getid(); V[y].push_back(x); in[x]++;}int main(){ scanf("%d", &T); getchar(); gets(ss); t = 0; init(); while(gets(ss)){ if(strcmp(ss, "")==0){ solve(); init(); } else{ insert(); } } solve(); return 0;}
0 0
- HDU 5098 Smart Software Installer(拓扑排序)
- HDU 5098 Smart Software Installer(拓扑排序+贪心)
- Hdu 5098 Smart Software Installer【思维+拓扑排序】
- 【拓扑排序】HDOJ 5098 Smart Software Installer
- HDOJ 5098 Smart Software Installer 拓扑排序
- HDOJ 5098 Smart Software Installer【拓扑排序】
- hdu 5098 Smart Software Installer 拓扑排序or记忆化搜索
- HDU 5098 Smart Software Installer 双队列拓扑排序或者DAG的最长路
- hdu 5098 smart software installer
- Hdu 5098 Smart Software Installer(记忆化搜索)
- 【瞎搞】 HDU 5098 Smart Software Installer
- HDU5098 Smart Software Installer (top排序)
- 2014上海全国邀请赛I题 Smart Software Installer(hdu5098)(top排序)
- hdu 5098 拓扑排序
- hdu Reward(拓扑排序)
- hdu 1285 (拓扑排序)
- hdu 3342(拓扑排序)
- hdu 4324 (拓扑排序)
- tomcat+SSH中遇到中文乱码的解决方法
- Machine Learning---LMS 算法
- 图像特征综述
- Objective-C基础笔记(5)Protocol
- 图解--算术表达式求值
- HDU 5098 Smart Software Installer(拓扑排序)
- 暴力破解之简单枚举2
- VC中添加背景图片,防止遮挡其他控件
- 隐马尔科夫模型(HMM)及其扩展
- ipset高大上性能果断将nf-HiPac逼下课
- openstack 网络发展简史
- 强大的矩阵奇异值分解(SVD)及其应用
- JavaScript初学者福利!必须收藏的24条小技巧
- 常用资源