利用并查集做

设某个要计算的点为p
然后对与p连接的那些点做深度搜索,然后在dfs中对他们经行合并操作。
最后判断祖先的数量有多少,若>1,则有几个祖先就说明有几个不一样的子集,也就是不能互相访问的子网。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<vector>
#include<set>
#include<queue>
#include<list>
using namespace std;vector<int> map[1001];
int anc[1001];
int maxn = 0;
int vis[1001];
int val[1001];
int temp[1001];
void init() {for (int i = 0; i <= maxn; i++) {map[i].clear();}maxn = 0;
}int Find(int id) {return (anc[id] == id) ? id : (anc[id] = Find(anc[id]));
}void unio(int p1, int p2) {int fp1 = Find(p1);int fp2 = Find(p2);if (val[fp1] > val[fp2]) {anc[p2] = fp1;val[fp1] += val[fp2];} else {anc[p1] = fp2;val[fp2] += val[fp1];}
}void dfs(int id) {vector<int> nd = map[id];for (int i = 0; i < nd.size(); i++) {if (!vis[nd[i]]) {vis[nd[i]] = 1;unio(id, nd[i]);dfs(nd[i]);}}
}int main() {int u, v, cur;cur = 0;while (cin >> u) {if (!u) break;if(cur){cout << endl;}cin >> v;init();map[u].push_back(v);map[v].push_back(u);maxn = max(maxn, max(u, v));while (cin >> u) {if (!u) break;cin >> v;map[u].push_back(v);map[v].push_back(u);maxn = max(maxn, max(u, v));}printf("Network #%d\n", ++cur);int flag=0;for (int i = 1; i <= maxn; i++) {vector<int> roots = map[i];memset(vis, 0, sizeof(vis));memset(temp, 0, sizeof(temp));//初始化for (int i = 1; i <= maxn; i++) {anc[i] = i;val[i] = 1;}vis[i] = 1;for (int j = 0; j < roots.size(); j++) {if (vis[roots[j]])continue;vis[roots[j]] = 1;dfs(roots[j]);}int res = 0;for (int j = 0; j < roots.size(); j++) {int fa = Find(roots[j]);if (!temp[fa]) {res++;temp[fa] = 1;}}//          printf("forbid i:%d\n", i);
//          for (int j = 1; j <= maxn; j++) {//              cout << j << "anc:" << anc[j] << endl;
//          }if (res > 1) {printf("  SPF node %d leaves %d subnets\n", i, res);flag=1;}}if(!flag){cout << "  No SPF nodes"<<endl;}}}

zoj 1119 SPF相关推荐

  1. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  2. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  3. ZOJ 题目分类,学校的一个巨巨做的。

     DP: 1011      NTA                    简单题 1013      Great Equipment        简单题 1024      Calendar ...

  4. poj题目详细分类及算法推荐题目

    DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题  ...

  5. ACM POJ 题目分类(完整整理版本)

    DP: 1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题   ...

  6. PUK ACM题目分类

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  7. pku,zju题目分类

    哎呦喂,直接ctrl+A了.话说浙江大学的题还见过的呢.. 公告: [意见反馈][官方博客]   ural pku Zju 题目分类 收藏   感谢 mugu 的提供.... Ural Problem ...

  8. ZOJ POJ题目分类

    ZOJ题目分类 初学者题:1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...

  9. 【ZOJ题目分类】备忘

    ZOJ 题目 分类 初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 ...

最新文章

  1. 框架SpringMVC笔记系列 二 传值
  2. php 字节序,Linux_Linux中网络字节序和主机字节序,主机字节序就是我们平常说的 - phpStudy...
  3. ADO.NET的数据库查询2009-12-07 02:20 P.M.ADO.NET的数据库查询
  4. lnmp1.4上thinkphp5.0出现404的解决办法
  5. this指向问题(2)
  6. ARM汇编ADR,LDR等伪指令
  7. 手机厂商探路互联网:硬件高利润时代已成历史
  8. python获取id标签对应数据_Python--Scrapy爬虫获取简书作者ID的全部文章列表数据
  9. android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...
  10. mysql 事务 数量_MySQL 数据查询语言(DQL) 事务控制语言(TCL)详解
  11. c语言皮尔森系数程序,按条件选入观测;皮尔森相关系数
  12. Bootstrap3 输入提示插件typeahead
  13. C# 序列化技术详解《转》
  14. DELPHI存储过程调用
  15. 【android开发】:android真机测试
  16. apache的日志切割
  17. 有关嵌入式的 github
  18. chemdraw20.0新功能及使用教程、安装教程
  19. web前端html5+css3学习笔记(3)——标签
  20. VS2019下添加include和lib

热门文章

  1. 面对搞不懂的Z世代,创业者应该掌握哪些“增长”密码?
  2. 跨境电商亚马逊卖家为何要使用云服务器?
  3. SSH登录慢的解决方案(例如等待很久才提示输入密码)
  4. aspx.net响应点击事件(页面button的onclick事件)
  5. php 支付宝回调验证失败,支付宝回调验证签名失败怎么解决?
  6. Telechips规格书 TCC8972-i 和 TCC5027
  7. CSDN用户社区内测启动!快加入《Java技术江湖——狗腿分湖》
  8. java 模拟 电话本系统 (基础版)
  9. 腾讯云接入备案流程 新手看过来
  10. 分奇偶页后Word导出PDF目录页后多了空白页