HDU 1827 - Summer Holiday(Tarjan + 缩点 + 计算入度)
2016-08-01 21:33
357 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1827题解:
与POJ 2553类似,只不过这个是计算入度。AC代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; vector <int> mapp[5000]; int dfn[5000],low[5000],color[5000],pene[5000],vis[5000],stk[5000],value[5000]; int n,m,x,y,cnt,t,sig; void init() { memset(vis,0,sizeof(vis)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(color,0,sizeof(color)); memset(pene,0,sizeof(pene)); memset(stk, 0, sizeof(stk)); //memset(vist,0,sizeof(vist)); memset(value,0,sizeof(value)); for(int i=1;i<=n;i++)mapp[i].clear(); } void Tarjan(int u) { vis[u] = 1; low[u] = dfn[u] = cnt++; stk[++t] = u; for(int j = 0; j < mapp[u].size(); j++) { int v = mapp[u][j]; if(!vis[v]) Tarjan(v); if(vis[v] == 1)low[u]=min(low[u],low[v]);//这里一定要用if,回溯的关键条件 } if(dfn[u] == low[u]) { sig++; do { color[stk[t]]=sig;//缩点之后同一强连通分量的点染成同一种颜色。 vis[stk[t]]=-1;//这个点相当于没了,染成同一种颜色意思就是缩成一个点了 } while(stk[t--]!=u); } } int fun(int x)//找一张强连通图里最便宜的那个人 { int minn=INT_MAX; for(int i=1;i<=n;i++){ if(color[i] == x && value[i]<minn) minn=value[i]; } return minn; } int main() { while(~scanf("%d%d", &n, &m)) { init(); for(int i = 1; i <= n; i++) scanf("%d", &value[i]); for(int i = 1; i <= m; i++) { scanf("%d%d", &x, &y); mapp[x].push_back(y); } cnt = 1, t = -1, sig = 0; for(int i = 1; i <= n; i++) { if(!vis[i]) Tarjan(i); } for(int i = 1; i <= n; i++) { for(int j = 0; j < mapp[i].size(); j++) { int v = mapp[i][j]; if(color[i] != color[v]) { pene[color[v]] ++;//计算入度 } } } int ct = 0,ans = 0; for(int i = 1; i <= sig; i++) { if(pene[i] > 0)continue; ans+= fun(i); ct ++; } printf("%d %d\n", ct, ans); } return 0; }
相关文章推荐
- HDU 1827 Summer Holiday(Tarjan缩点)
- hdu 1827 Summer Holiday tarjan 加缩点
- hdu 1827 Summer Holiday Tarjan缩点+度数判断 解题报告
- hdu 1827 Summer Holiday【Tarjan缩点】
- HDU 1827 Summer Holiday(Tarjan缩点)
- HDU 1827--Summer Holiday【强连通缩点新建图】
- HDU 1827 Summer Holiday 强连通缩点
- HDU 1827 - Summer Holiday (强连通 + 缩点)
- hdoj 1827 Summer Holiday 【有向图 连通最少的点来间接连通所有点】 【tarjan求 SCC + 缩点】
- HDU-5934 Bomb(tarjan缩点+入度0最小和)
- HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点
- HDU 1827 强连通 缩点 Summer Holiday
- Summer Holiday (hdu 1827 强联通缩点)
- hdu 1827 Summer Holiday(tarjan)
- HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)
- hdu 1827 Summer Holiday
- hdu 1827 有向图缩点看度数
- hdu 1827 有向图缩点看度数
- HDU 1827 强联通缩点
- HDU 1827 Summer Holiday(强连通分量)