称号:http://community.topcoder.com/stat?c=problem_statement&pm=13251&rd=16017

參考:http://apps.topcoder.com/wiki/display/tc/TCO+2014+Round+2C

假设用先计算出每条边,用邻接矩阵来表示图,然后用BFS或 Floyd-Warshall算法来计算距离的话。时间复杂度是O(N^3),会超时。依据题名的提示知要利用clique graph的性质来做。基本思想是在BFS的时候将一个clique看成一个总体。一旦訪问到clique中的一个点,则这个clique中全部点的距离都能够得到。算法描写叙述例如以下

for each source vertex s:

    mark all vertices and all cliques as unvisited

    start BFS from s

    when processing a vertex v during the BFS:

        for each unvisited clique C that contains v:

            mark C as visited

            use edges in C to discover new vertices

代码:

#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip> #include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map> #include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std; #define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> pll;
#define mkp make_pair /*************** Program Begin **********************/
bool visited_vertex[5001];
bool visited_clique[5001]; class CliqueGraph {
public:
long long calcSum(int N, vector <int> V, vector <int> sizes) {
long long res = 0;
vector <int> S(sizes.size() + 1);
S[0] = 0;
for (int i = 0; i < sizes.size(); i++) {
S[i + 1] += S[i] + sizes[i];
}
vector <vector<int>> cliques(sizes.size()); // clique i 包括的点
vector <vector<int>> vcliques(N); // 包括点v的cliques
for (int i = 0; i < sizes.size(); i++) {
for (int j = S[i]; j < S[i + 1]; j++) {
cliques[i].push_back(V[j]);
vcliques[ V[j] ].push_back(i);
}
} for (int src = 0; src < N; src++) {
vector <int> D(N, 123456789);
D[src] = 0;
memset(visited_vertex, 0, sizeof(visited_vertex));
memset(visited_clique, 0, sizeof(visited_clique));
queue <int> Q;
Q.push(src);
visited_vertex[src] = true;
while (!Q.empty()) {
int v = Q.front();
Q.pop();
// 更新全部包括v的cliques中的全部点
for (int i = 0; i < vcliques[v].size(); i++) {
int c = vcliques[v][i]; // 包括v的cliques
if (visited_clique[c]) {
continue;
}
visited_clique[c] = true;
for (int j = 0; j < cliques[c].size(); j++) {
int u = cliques[c][j]; // clique c z中的的点
if (visited_vertex[u]) {
continue;
}
visited_vertex[u] = true;
D[u] = D[v] + 1;
Q.push(u);
}
}
}
for (int i = 0; i < N; i++) {
res += D[i];
}
}
return res / 2;
};
}; /************** Program End ************************/

版权声明:本文博主原创文章,博客,未经同意不得转载。

TCO14 2C L2: CliqueGraph,graph theory, clique的更多相关文章

  1. The Beginning of the Graph Theory

    The Beginning of the Graph Theory 是的,这不是一道题.最近数论刷的实在是太多了,我要开始我的图论与树的假期生活了. 祝愿我吧??!ShuraK...... poj18 ...

  2. HDU6029 Graph Theory 2017-05-07 19:04 40人阅读 评论(0) 收藏

    Graph Theory                                                                 Time Limit: 2000/1000 M ...

  3. Codeforces 1109D. Sasha and Interesting Fact from Graph Theory

    Codeforces 1109D. Sasha and Interesting Fact from Graph Theory 解题思路: 这题我根本不会做,是周指导带飞我. 首先对于当前已经有 \(m ...

  4. 2018 Multi-University Training Contest 4 Problem L. Graph Theory Homework 【YY】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Problem L. Graph Theory Homework Time Limit: 2000 ...

  5. Graph Theory

    Description Little Q loves playing with different kinds of graphs very much. One day he thought abou ...

  6. 2017中国大学生程序设计竞赛 - 女生专场(Graph Theory)

    Graph Theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  7. ACM学习历程—NPU1045 2015年陕西省程序设计竞赛网络预赛(热身赛)C题 Graph Theory(递推 && 组合数学 && 大数)

    Description In graph theory, a matching or independent edge set in a graph G = (V , E) is a set of e ...

  8. 图论介绍(Graph Theory)

    1 图论概述 1.1 发展历史 第一阶段: 1736:欧拉发表首篇关于图论的文章,研究了哥尼斯堡七桥问题,被称为图论之父 1750:提出了拓扑学的第一个定理,多面体欧拉公式:V-E+F=2 第二阶段( ...

  9. Introduction to graph theory 图论/脑网络基础

    Source: Connected Brain Figure above: Bullmore E, Sporns O. Complex brain networks: graph theoretica ...

随机推荐

  1. sails不是内部或外部命令的解决方案

    1 安装好node 2 安装sails 打开cmd窗口,用命令 npm -g install sails 安装sails 安装完成后,用命令  sails new testProject 创建项目 会 ...

  2. Mean Shift简介

    Mean Shift,我们 翻译“平均漂移”. 其集群,图像平滑. 图像分割和跟踪已广泛应用.因为我现在认为追踪,因此推出Mean Shift该方法用于目标跟踪.从而MeanShift較全面的介绍. ...

  3. 黑马程序员—创建JDBC框架及原理分析

    对于Java数据库的连接,由最初学习的每次全部手工代码,到后面的不断利用知识简化代码量:这是不断学习的过程,就像人类由原始社会的钻木取火到当代的文明,都是一步步过来的! 本文不从最开始的JDBC入门开 ...

  4. 找呀志_java网络编程(4)TCP/IP、Http和Socket差额

    经java网络编程(1)网络体系结构及通信协议我知道IP协议相应于网络层.TCP协议相应于传输层.而HTTP协议相应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据怎 ...

  5. ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

    原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...

  6. VS2010或2012中,如何设置代码格式化?

    ctrl + E,D菜单在 编辑-->高级 里面 第一个菜单项

  7. 策略模式Strategy——坐什么车回家?

    1.存在的问题和模型 :2014年6月       学校:廊坊师范        家:石家庄       人物:学生 又快到期末考试了.回家的节奏也奔上日程,无聊之余就想想这次回家的事儿. 对我来说回 ...

  8. url参数中出现+、空格、=、%、&、#等字符的解决办法

    url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?解决办法将这些字符转化成服务器可以识别的字符,对应关系如下:URL字符转义 用其它 ...

  9. 简单实现Android平台多语言

    这里,我们认识到两种语言.中国简体和繁体中国. 在res文件建议两个文件夹 values-zh-rCN values-zh-rTW 两个目录下都有一个strings.xml文件. 两个同名文件的字符串 ...

  10. 遗传算法解决旅行商问题(TSP)

    这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...