SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)
题目:http://community.topcoder.com/stat?c=problem_statement&pm=13275&rd=16008
由于图中边数不多,选择DFS遍历全部路径,计算路径Inversions时使用了一个R[] 数组,能够在O(N)时间内得到路径Inversions,又由于该图所以路径条数为O(N^2),算法复杂度为O(N^3),对于N为1000的限制来说,复杂度较高,但实际測试中,最慢的測试用例费时700多ms,没有超时。若要减小复杂度,须要更高效的算法来计算路径的Inversions,使用 Binary
indexed tree (BIT)数据结构能够达到O(logN), 总复杂的减小到O(N^2logN)。
代码:
#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 **********************/
const int INF = 1000000000;
class GraphInversions {
public:
vector <int> V, A, B, adj[1001];
bool visited[1005]; // 顶点的訪问状态
int R[1005]; // 用于计算 Inversions, R[weight] 表示当前路径上权值为weight的顶点的个数
int N, K, ans;
void DFS(int u, int d, int invs)
{
if (d == K) {
ans = min(ans, invs);
} else if (d < K) {
for (int i = 0; i < adj[u].size(); i++) {
int w = adj[u][i];
if (visited[w]) {
continue;
}
visited[w] = true;
++R[ V[w] ];
DFS(w, d + 1, invs + accumulate(R + V[w] + 1, R + 1001, 0));
--R[ V[w] ]; // 将顶点从该路径排除
visited[w] = false; // 还有一条路径依旧能够使用该顶点
}
} }
int getMinimumInversions(vector <int> A, vector <int> B, vector <int> V, int K) {
int res = INF;
this->N = A.size();
this->V = V;
this->K = K; for (int i = 0; i < N; i++) {
adj[ A[i] ].push_back(B[i]);
adj[ B[i] ].push_back(A[i]);
} for (int i = 0; i < N; i++) { // 依次遍历全部顶点,以每一个顶点为起始点进行DFS
ans = INF;
memset(visited, 0, sizeof(visited));
memset(R, 0, sizeof(R));
visited[i] = true; // 这一步不要忘,起始点訪问状态应为TRUE
++R[ V[i] ]; // 将起始点增加到路径中
DFS(i, 1, 0);
res = min(res, ans);
}
return (res == INF ? -1 : res);
}
}; /************** Program End ************************/
SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)的更多相关文章
- Linux find查找指定文件 按照名称 然后cp拷贝到指定目录且指定文件名
最近有一个需求,需要将指定目录下的文件(已知文件名)复制到另一个指定的目录且重命名文件. 要求: 在var目录下会定义系统的启动日志相关信息,请查找对应的boot.log文件,并把它备份一份到var/ ...
- 学underscore在数组中查找指定元素
前言 在开发中,我们经常会遇到在数组中查找指定元素的需求,可能大家觉得这个需求过于简单,然而如何优雅的去实现一个 findIndex 和 findLastIndex.indexOf 和 lastInd ...
- SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据
表中太多列,只想查找某些比如,数据类型为varchar的字段的数据. 思路:1.先获取列名: select * from syscolumns where id=(select max(id) fro ...
- .NET截取指定长度汉字超出部分以"..."代替
/// <summary> /// 将指定字符串按指定长度进行剪切, /// </summary> /// <param name= "oldStr " ...
- Java-生成指定长度验证码的一种简单思路
前言:以前做过的一个项目,刚开的时候始验证码是在前端生成前端验证的,后来觉得不靠谱,另外就是找回密码的功能也需要发送邮件和短信的验证码,所以,验证码就必须在后端生成并且保存到应用会话中才行了!所以, ...
- C++查找指定目录下所以指定类型的文件
/*************************************************************** 函数名称:FindFile 查找指定目录下指定文件 输入:fileNa ...
- php随机生成指定长度的字符串 可以固定数字 字母 混合
php 生成随机字符串 可以指定是纯数字 还是纯字母 或者混合的. 可以指定长度的. function rand_zifu($what,$number){ $string=''; for($i = 1 ...
- 菜鸟学Linux命令:lsof命令 查找指定用户、进程、端口打开的文件
lsof,list open files, 是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件. 命令格式:ls ...
- asp.net截取指定长度的字符串内容
/// <summary> /// 用于截取指定长度的字符串内容 /// </summary> /// <param name="sString"&g ...
随机推荐
- [Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)
题目链接:http://acm.swust.edu.cn/problem/0666/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- 分享一个 CSDN 自动评论角本
先修改帐户名和密码 import requests from BeautifulSoup import BeautifulSoup import time def commitfunc(source_ ...
- Python 数据处理扩展包: numpy 和 pandas 模块介绍
一.numpy模块 NumPy(Numeric Python)模块是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list str ...
- configure.ac
# # Copyright (C) - Tobias Brunner # Copyright (C) - Andreas Steffen # Copyright (C) - Martin Willi ...
- [cocos2d-x]针对不同的设备,选取不同的自适应图片
前言: 我们在进行移动设备开发的时候,我们常常会准备不同大小的图片资源以适应不同大小的设备,下面我称普清图片资源和高清图片资源.那么如何做到图片资源的自适应呢?下面我来用一个demo展示一下这个效果的 ...
- block 解析 - 简介
简介 block 类似标准的c函数,除了一些函数体一些可执行的代码,还可以把变量绑定到自动栈或者托管堆上.....和js里的闭包.c# lambda表达式有些类似,实质是一个函数指针.与函数指针的区别 ...
- [ExtJS5学习笔记]第十五节 Extjs5表格显示不友好?panel的frame属性在作怪
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39057243 sencha官方API:http://docs.sencha.com/e ...
- Domain(AD) 管理
新建账户 文件夹权限管理
- JS - 按钮倒计时
效果: html代码: <input type="button" id="btn" value="点击获取效验码" /> js代 ...
- CF#231DIV2:A Good Number
Let's call a number k-good if it contains all digits not exceeding k (0, ..., k). You've got a numbe ...