正文

Zju 1119 SPF2006-09-11 23:24:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/18473.html

分享到:

2062175 2006-09-11 23:10:31 Accepted 1119 C++ 00:00.08 4368K St.Crux     若干年以前,这个题就应该被AC了——对弱题的冲动、严蔚敏老师的数据结构、标程——AC的三大要素我都有了,但是我一直停留在第一阶段——被邓公称作是一百年不变的初级阶段。三十年前,光明日报的编辑写过,实践是检验真理的唯一标准。然而在特定的时间,特定的地点,特定的人物身上,实践只会成为怀疑真理的唯一标准。幸好我还有第三样法宝。     修改过的标程 #include <cstdio>#include <string> int x, y, vx, idx, a[1001][1001], dfn[1001], low[1001], sub[1001], root, c = 0, mx, mn;// low[] means the lowest point one root and its subtree point to int min(int a, int b){ return a > b ? b : a;} void init(){ memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); memset(sub, 0, sizeof(sub)); idx = 1, low[vx] = dfn[vx] = idx, root = 0;} void dfs(int i){ int k;  for(k = mn; k <= mx; k ++) {  if(a[i][k])  // k adjacent to i  {   if(!dfn[k]) // k not visited -- k is in subtree   {    idx ++;    dfn[k] = low[k] = idx;    dfs(k);     low[i] = min(low[i], low[k]);    // and if k is subtree, judge if it is AP(articulation point)    if(low[k] >= dfn[i])    {     if(i == vx) root ++;     if(i != vx) sub[i] ++;    }   }   else // k visited -- k is ancestor   {    low[i] = min(low[i], dfn[k]);   }  } }} void print(){ if(c ++) printf("\n"); printf("Network #%d\n", c); int i, f = 0; //pl(); if(root > 1) sub[vx] = root - 1; for(i = mn; i <= mx; i ++) {  if(sub[i])  {   f = 1;   printf("  SPF node %d leaves %d subnets\n", i, sub[i] + 1);  } } if(!f)  printf("  No SPF nodes\n");} int main(){ //freopen("in.txt", "r", stdin); while(scanf("%d", &x) && x) {    vx = x;  memset(a, 0, sizeof(a));  scanf("%d", &y);  a[x][y] = 1;  a[y][x] = 1;  mx = x, mn = x;  if(y > mx) mx = y;  if(y < mn) mn = y;  while(scanf("%d", &x) && x)  {   scanf("%d", &y);   a[x][y] = 1;   a[y][x] = 1;   if(x > mx) mx = x;   if(x < mn) mn = x;   if(y > mx) mx = y;   if(y < mn) mn = y;  }  init();  dfs(vx);  print(); } return 0;}    

阅读(4486) | 评论(5)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册