Chinaunix首页 | 论坛 | 博客
  • 博客访问: 472151
  • 博文数量: 117
  • 博客积分: 3195
  • 博客等级: 中校
  • 技术积分: 1156
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 01:44
文章分类

全部博文(117)

文章存档

2012年(5)

2011年(5)

2010年(46)

2009年(61)

我的朋友

分类: C/C++

2010-05-06 23:25:21

题意:

网络中有一些学校,每个学校可以分发软件给其他学校。可以向哪个分发取决于他们各自维护的一个清单。

有两个问题,1:至少要copy多少份新软件给那些学校, 才能使得每个学校都能得到。

2:要在所有的学校的清单里面至少一共增加几项才能 使得  把软件给任意一个学校,所有的学校都能收得到。

 

思路:

       整个就是一个有向图啊, 学校是节点, 它的表里面有从他出发到其他节点的边。

       问题一: 要使每个学校都能收到,就是计算图里面一共有多少入度是0的点,这个好理解。

      问题二: 先学习下计算强连通分支的算法——kosaraju, 用两次dij的, 然后缩点,把每一块看成一个点,出来一个新的有向图。然后计算出度为0的入度为0的点各有多少, 大的那个就是答案。至于为什么,  还没搞明白。

做的时候用邻接表建两个图,kosaraju算法用到两次dfs, 第二次的时候,d[i]记录vi点在哪个连通分支里面,返回后, 枚举每个顶点统计每个分支的入度和出度,   为0的各有多少, 输出大的。 

值得注意的是, 当只有一个强连通分支的时候,就是缩点后只有一个点,虽然入度出度为0的都有一个,但是实际上不需要增加清单的项了,所以答案是1,0

阅读(1092) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~