hdu 1827 强连通缩点
2012-07-24 15:42
232 查看
#include <iostream> #include <cstring> #include <stack> #define INF 0x3f3f3f3f #define clr(x, k) memset((x),(k),sizeof(x)) using namespace std; const int N = 1001; struct edge { int s, e, next; }edg1[2*N], edg2[2*N]; int n, m, ct, index, et1, et2; int head , dfn , low , belong ; int p , indegree , mmm ; bool instack ; stack <int> s; void add_e(int u, int v, edge edg[], int &et) { edg[et].s = u; edg[et].e = v; edg[et].next = head[u]; head[u] = et++; } void read() { int i, u, v; for (i=1;i<=n;++i) { scanf("%d", &p[i]); } et1 = 0; clr(head, -1); while (m--) { scanf("%d %d", &u, &v); add_e(u, v, edg1, et1); } } void tarjan(int i) { int j; dfn[i] = low[i] = ++index; s.push(i); instack[i] = true; for (int u=head[i];u!=-1;u=edg1[u].next) { j = edg1[u].e; if (dfn[j]==0) { tarjan(j); if (low[i]>low[j]) low[i] = low[j]; } else if (instack[j] && low[i]>dfn[j]) low[i] = dfn[j]; } if (low[i] == dfn[i]) { ct++; do { j = s.top(), s.pop(); instack[j] = false; belong[j] = ct; if (mmm[ct]>p[j]) mmm[ct] = p[j]; }while (i!=j); } } void ace() { int i; clr(mmm, INF); ct = index = 0; clr(dfn, 0); clr(instack, 0); for (i=1;i<=n;++i) { if (!dfn[i]) tarjan(i); } int x; et2 = 0; clr(head, -1); clr(indegree, 0); for (i=0;i<et1;++i) { int j = edg1[i].s; int k = edg1[i].e; if (belong[j] != belong[k]) { add_e(belong[j], belong[k], edg2, et2); indegree[belong[k]]++; } // if (mmm[belong[j]]>p[j]) mmm[belong[j]] = p[j]; // if (mmm[belong[k]]>p[k]) mmm[belong[k]] = p[k]; } int sum = 0, num = 0; for (i=1;i<=ct;i++) { if (indegree[i]==0) { sum += mmm[i]; num++; } } printf("%d %d\n", num, sum); } int main() { while (~scanf("%d %d", &n, &m)) { read(); ace(); } return 0; }
划掉的两个if:mmm数组要在tarjan里更新,可能有孤点存在。。。。
for simplicity 借鉴了鸟神的ace~
相关文章推荐
- HDU 1827 强连通缩点
- HDU 1827 Summer Holiday 强连通缩点
- HDU 1827--Summer Holiday【强连通缩点新建图】
- hdu 1827 有向图缩点看度数
- HDU 1827 Summer Holiday(Tarjan缩点)
- HDU 1827 强联通缩点
- hdu 1827 有向图缩点看度数
- hdu 1827 Summer Holiday tarjan 加缩点
- HDU 1827 - Summer Holiday (强连通 + 缩点)
- HDU 1827 Summer Holiday(Tarjan缩点)
- Summer Holiday (hdu 1827 强联通缩点)
- hdu 3836 Equivalent Sets hdu 2767 Proving Equivalences 强连通缩点入门
- HDU 1827 Summer Holiday(强连通)
- hdu 2767 强连通缩点
- hdu 1827 Summer Holiday【强连通Kosaraju+缩点染色+思维】
- hdu 1827 Summer Holiday (强连通)
- HDU 1827 - Summer Holiday(Tarjan + 缩点 + 计算入度)
- hdu 1827 Summer Holiday【Tarjan缩点】
- HDU 1827 强连通 缩点 Summer Holiday
- hdu1827 强连通