POJ1236—— Network of Schools
来源:互联网 发布:dota2台词 知乎 编辑:程序博客网 时间:2024/05/29 13:05
大致思路:
第一个小问是问在多少电脑上放置源文件,能传遍整个计算机网络,答案很明显就是强连通缩点之后入度为0的点的个数。
第二个小问是问加多少边之后,在任意一个电脑上放置源文件,就能传遍整个计算机网络,这个问题就是要把缩点之后的图变成一个强连通分量,也就是说要消灭入度为0和出度为0的点,所以答案就是max(入度=0的点,出度=0的点)。
代码:
#include <set>#include <map>#include <list>#include <stack>#include <queue>#include <ctime>#include <cmath>#include <cstdio>#include <vector>#include <string>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#pragma comment(linker, "/STACK:1024000000,1024000000")#define IT iterator#define PB(x) push_back(x)#define CLR(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long ll;typedef unsigned long long ull;typedef vector<int> vint;typedef vector<ll> vll;typedef vector<ull> vull;typedef set<int> sint;typedef set<ull> sull;const int maxn = 10000 + 5;vint G[maxn];int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;stack<int> S;int a[maxn];void init(int n) { for (int i = 0; i <= n; i++) G[i].clear();}void dfs(int u) { pre[u] = lowlink[u] = ++dfs_clock; S.push(u); for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (!pre[v]) { dfs(v); lowlink[u] = min(lowlink[u],lowlink[v]); } else if (!sccno[v]) { lowlink[u] = min(lowlink[u],pre[v]); } } if (lowlink[u] == pre[u]) { scc_cnt++; while (1) { int x = S.top(); S.pop(); sccno[x] = scc_cnt; if (x == u) break; } }}void find_scc(int n) { dfs_clock = scc_cnt = 0; CLR(sccno,0); CLR(pre,0); for (int i = 1; i <= n; i++) { if (!pre[i]) dfs(i); }}int in[maxn];int out[maxn];int main() { int n,m; //freopen("data.in","r",stdin); while (cin>>n) { init(n); for (int i = 1; i <= n; i++) { int m; while (scanf("%d",&m),m) { G[i].PB(m); } } //for (int i = 0; i <= scc_cnt; i++) new_g[i].clear(); find_scc(n); CLR(in,0); CLR(out,0); int tmpa = 0,tmpb = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j < G[i].size(); j++) { int v = G[i][j]; if (sccno[i] != sccno[v]) { out[sccno[i]]++; in[sccno[v]]++; } } } for (int i = 1; i <= scc_cnt; i++) { if (!out[i]) tmpb++; if (!in[i]) tmpa++; } cout<<tmpa<<endl<<(scc_cnt == 1 ? 0 : max(tmpb,tmpa))<<endl; }}
0 0
- POJ1236——Network of Schools
- POJ1236—— Network of Schools
- poj1236 - Network of Schools
- POJ1236 Network of Schools
- poj1236 Network of Schools
- poj1236 Network of Schools
- poj1236 Network of Schools
- poj1236-Network of Schools
- POJ1236 Network of Schools
- [Poj1236]Network of Schools
- POJ1236 Network of Schools
- poj1236 Network of Schools
- 【poj1236】 Network of Schools
- poj1236 Network of Schools
- POJ1236-Network of Schools
- POJ1236 Network of Schools
- POJ1236 Network of Schools,Tarjan
- POJ1236 Network of Schools (Tarjan)
- android开发 - ViewPager使用
- UITableView性能优化及使用总结
- poj 1177 || HDU 1828 Picture (线段树扫描线求 图形并的周长)
- 第2章 10
- 一个有趣的问题:ls -l显示的内容中total到底是什么?
- POJ1236—— Network of Schools
- struts2中 # % $ 的区别和用法
- NopCommerce多商城设置
- 第一次FLEX实验单新鲜出炉
- poj 3907 Build Your Home 多边形面积
- android开发 - Widgets窗口小部件
- 用Java语言实现二叉树删除结点
- leetcode || 60、Permutation Sequence
- poj 2796 Feel Good