【强连通分量+缩点】 HDOJ 1827 Summer Holiday
来源:互联网 发布:mac nestopia金手指 编辑:程序博客网 时间:2024/05/19 05:40
先求出强连通分量,每个强连通分量都可以看成一个点,这个点的权值是这个连通分量重权值最小的,然后计算一下所有点的入度,入度为0的点的个数和权值和就是答案了。。
#include <iostream> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib>#include <cmath>#include <time.h>#define maxn 1005#define maxm 4005#define eps 1e-10#define mod 1000000009#define INF 99999999 #define lowbit(x) (x&(-x)) //#define lson o<<1, L, mid //#define rson o<<1 | 1, mid+1, R typedef long long LL;//typedef int LL;using namespace std;int H[maxn], v[maxm], next[maxm];int h[maxn], vv[maxm], nn[maxm];int dfn[maxn], low[maxn];int id[maxn], in[maxn], du[maxn];int vis[maxn], n, m, top;int w[maxn];stack<int> s;void read(void){int a, b, i, cnt = 0;for(i = 1; i <= n; i++) scanf("%d", &w[i]);while(m--) {scanf("%d%d", &a, &b);next[cnt] = H[a], v[cnt] = b, H[a] = cnt, cnt++;}}void init(void){top = 0;memset(H, -1, sizeof H);memset(h, -1, sizeof h);memset(du, 0, sizeof du);memset(in, 0 ,sizeof in);memset(vis, 0, sizeof vis);memset(dfn, 0, sizeof dfn);}void build(void){int i, cnt = 0;for(i = 1; i <= n; i++)for(int e = H[i]; ~e; e = next[e])nn[cnt] = h[id[i]], h[id[i]] = cnt, vv[cnt] = id[v[e]], cnt++;}void tarjan(int u){dfn[u] = low[u] = ++top;s.push(u), in[u] = 1;for(int e = H[u]; ~e; e = next[e]) {if(!dfn[v[e]]) {tarjan(v[e]);low[u] = min(low[u], low[v[e]]);}else if(in[v[e]]) low[u] = min(low[u], dfn[v[e]]);}if(dfn[u] == low[u]) {int tmp = s.top(); s.pop(), in[tmp] = 0;while(tmp != u) {id[tmp] = u;w[u] = min(w[u], w[tmp]);tmp = s.top();s.pop();in[tmp] = 0;}id[tmp] = u;}}void work(void){int ans = 0, cost = 0;for(int i = 1; i <= n; i++)if(!dfn[i]) tarjan(i);build();for(int i = 1; i <= n; i++)for(int e = h[i]; ~e; e = nn[e])if(vv[e] != i)du[vv[e]]++;for(int i = 1; i <= n; i++)if(!vis[id[i]] && !du[id[i]])vis[id[i]] = 1, ans++, cost += w[id[i]];printf("%d %d\n", ans, cost);}int main(void){while(scanf("%d%d", &n, &m)!=EOF) {init();read();work();}return 0;}
0 0
- 【强连通分量+缩点】 HDOJ 1827 Summer Holiday
- HDU 1827 Summer Holiday (强连通分量+缩点)
- HDU 1827 Summer Holiday 强连通分量缩点
- hdu 1827 Summer Holiday 强连通分量缩点
- hdu 1827 Summer Holiday(强连通分量+缩点)
- HDOJ 题目1827 Summer Holiday(强连通分量,缩点)
- [HDU1827]Summer Holiday(Tarjan缩点+强连通分量)
- hdoj Summer Holiday 1827 (强连通分量 求最少连通多少点从而连通所有点) arjan求SCC+缩点 好题
- HDU 1827 Summer Holiday(强连通分量)
- HDU 1827 Summer Holiday(强连通分量)
- hdu 1827 summer holiday 强连通分量
- HDU ACM 1827 Summer Holiday->强连通分量+缩点(tarjan算法)
- HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点
- HDU 1827 - Summer Holiday (强连通 + 缩点)
- HDOJ--1827--Summer Holiday(强连通分量的最小代价连接)
- HDU1827 Summer Holiday 解题报告【tarjan/强连通分量+缩点】
- hdoj 1827 Summer Holiday 强联通缩点
- hdu 1827 Summer Holiday (强连通分量)
- Java实现的拦截器
- Windows下备份网络文件批处理文件
- 基于Android的小巫新闻客户端开发--UI设计(主界面)
- SQL Server 基础知识
- 将任意程序添加到右键菜单—以sublime text为例
- 【强连通分量+缩点】 HDOJ 1827 Summer Holiday
- C++虚函数实现机制总结
- rmmod: chdir(2.6.38-FriendlyARM): No such file or directory
- 基于Android的小巫新闻客户端开发--主界面业务逻辑实现
- 围住神经猫源代码下载
- 基于Android小巫新闻客户端开发---显示新闻详细内容UI设计
- 基于Android的小巫新闻客户端开发---显示新闻详细内容业务逻辑实现
- 一个小问题——宽,高和图片大小。
- 关于BO授权 和 ORACLE ODBC连接 问题