- 浏览: 390812 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- java编程 (4)
- java实用程序 (2)
- 算法设计 (34)
- 数据库 (8)
- ACM模板 (12)
- 技术术语 (1)
- java_web (3)
- php (22)
- eclipse (3)
- linux (25)
- linux命令使用心得 (3)
- web服务器 (8)
- IT知识 (2)
- 前端技术 (17)
- 开源软件 (5)
- vim (3)
- linux多线程 (9)
- web开发经验 (3)
- lua (5)
- linux编程 (3)
- smarty (1)
- mysql (4)
- Hive (2)
- 数据挖掘 (9)
- python (2)
- 生活 (1)
- C++ (2)
- 计算机 (1)
- objective-c (11)
- css (2)
- 游戏 (1)
- Mac (1)
最新评论
-
lr544463316:
我的怎么不行呀.....
Mysql Access denied for user ''@'localhost' to database 的一种解决方法 -
babaoqi:
使用时需要注意group_concat函数返回值的最大长度=g ...
mysql中的group_concat函数 -
代码能力弱成渣:
可以帮我看下我的代码么?我自己写的sam,也有ac过题的,但是 ...
求两个字符串的最长公共连续子序列(SAM实现) -
atgoingguoat:
有1000个?不过还是收藏下。
jquery常用的插件1000收集(转载)
title:Transitive Closure
题目简述:给出一个有向图,求有多少组(x, y)使得x到y有一条路径并且x不等于y。
解法: 强连通分量+拓扑排序+位运算#include <stdio.h>
#include <vector> using namespace std; /************************ init: stop,cnt,scnt, en置0; pre[]置-1, fir[]置NULL CALL:for(i = 0; i < n; i++) if(-1 == pre[i]) tarjan(i, n); ************************/ #define V 2505 #define E 10005 typedef vector<int> vi; const int K=V/30+5; struct e{ int v; e* nxt; }es[E]; e* fir[V]; int id[V], pre[V], low[V], s[V], stop, cnt, scnt; int en; int n; int num[V], size[V], tid[V]; vi son[V], rson[V]; int has[V][K]; void tarjan(int v, int n){ int t, minc = low[v] = pre[v] = cnt++; e* cur; s[stop++] = v; for(cur = fir[v]; cur ; cur = cur->nxt){ if(-1 == pre[cur->v]) tarjan(cur->v, n); if(low[cur->v] < minc) minc = low[cur->v]; } if(minc < low[v]){ low[v] = minc; return; } do{ id[t = s[--stop]] = scnt; low[t] = n; }while(t != v); ++scnt; //强连通分量的个数 } inline void add_e(int u, int v){ es[en].v = v; es[en].nxt = fir[u]; fir[u] = &es[en++]; } void getSCC(int n){ //get strongly connected component stop = cnt = scnt = 0; int i; for(i = 0; i < n; i++) pre[i] = -1; for(i = 0; i < n; i++) if(-1 == pre[i]) tarjan(i, n); } bool input(){ scanf("%d", &n); int u, v, i, e; scanf("%d", &e); for(i = 0; i < n; i++) fir[i] = NULL; en = 0; while(e--){ scanf("%d%d", &u, &v); u--; v--; add_e(u, v); } return true; } void topu(int id){ pre[id]=0; int v, i, s; for(s=son[id].size(), i=0; i<s; i++){ if(pre[v=son[id][i]]==-1){ topu(v); } } tid[cnt++]=id; } void solve(){ getSCC(n); int i, ans, u, v, k, j, s, h, g; e* cur; for(i=0; i<scnt; i++){ son[i].clear(); rson[i].clear(); size[i]=0; } for(i=0; i<n; i++){ size[u=id[i]]++; for(cur=fir[i]; cur; cur=cur->nxt){ if((v=id[cur->v])!=u){ son[u].push_back(v); rson[v].push_back(u); } } } for(ans=i=0; i<scnt; i++){ ans += size[i]*(size[i]-1); pre[i]=-1; } cnt=0; k=scnt/30+(scnt%30==0 ? 0: 1); for(i=0; i<scnt; i++){ if(pre[i]==-1){ topu(i); } for(j=0; j<k; j++){ has[i][j]=0; } } for(i=0; i<scnt; i++){ u=tid[i]; for(s=son[u].size(), j=0; j<s; j++){ v=son[u][j]; for(h=0; h<k; h++){ has[u][h] |= has[v][h]; } has[u][v/30] |= (1<<(v%30)); } for(h=0; h<k; h++){ v=has[u][h]; for(g=0; v; v>>=1, g++){ if(v&1){ ans += size[u]*size[h*30+g]; } } } } printf("%d\n", ans); } int main(){ int t; scanf("%d", &t); while(t--){ input(); solve(); } return 0; }
暴力广搜的版本:
#include <stdio.h> #include <vector> using namespace std; /************************ init: stop,cnt,scnt, en置0; pre[]置-1, fir[]置NULL CALL:for(i = 0; i < n; i++) if(-1 == pre[i]) tarjan(i, n); ************************/ #define V 2505 #define E 10005 typedef vector<int> vi; const int K=V/30+5; struct e{ int v; e* nxt; }es[E]; e* fir[V]; int id[V], pre[V], low[V], s[V], stop, cnt, scnt; int en; int n; int num[V], size[V], tid[V], que[V]; vi son[V]; int has[V][K]; void tarjan(int v, int n){ int t, minc = low[v] = pre[v] = cnt++; e* cur; s[stop++] = v; for(cur = fir[v]; cur ; cur = cur->nxt){ if(-1 == pre[cur->v]) tarjan(cur->v, n); if(low[cur->v] < minc) minc = low[cur->v]; } if(minc < low[v]){ low[v] = minc; return; } do{ id[t = s[--stop]] = scnt; low[t] = n; }while(t != v); ++scnt; //强连通分量的个数 } inline void add_e(int u, int v){ es[en].v = v; es[en].nxt = fir[u]; fir[u] = &es[en++]; } void getSCC(int n){ //get strongly connected component stop = cnt = scnt = 0; int i; for(i = 0; i < n; i++) pre[i] = -1; for(i = 0; i < n; i++) if(-1 == pre[i]) tarjan(i, n); } bool input(){ scanf("%d", &n); int u, v, i, e; scanf("%d", &e); for(i = 0; i < n; i++) fir[i] = NULL; en = 0; while(e--){ scanf("%d%d", &u, &v); u--; v--; add_e(u, v); } return true; } int BFS(int s){ int l, r, num, i, v, u, ans; pre[s]=s; for(ans=l=r=0, que[r++]=s; l!=r; ){ for(num=son[u=que[l++]].size(), i=0; i<num; i++){ if(pre[v=son[u][i]]!=s){ pre[v]=s; ans+=size[s]*size[v]; que[r++]=v; } } } return ans; } void solve(){ getSCC(n); int i, ans, u, v; e* cur; for(i=0; i<scnt; i++){ son[i].clear(); size[i]=0; } for(i=0; i<n; i++){ size[u=id[i]]++; for(cur=fir[i]; cur; cur=cur->nxt){ if((v=id[cur->v])!=u){ son[u].push_back(v); } } } for(ans=i=0; i<scnt; i++){ ans += size[i]*(size[i]-1); pre[i]=-1; } for(i=0; i<scnt; i++){ ans+=BFS(i); } printf("%d\n", ans); } int main(){ int t; scanf("%d", &t); while(t--){ input(); solve(); } return 0; }
发表评论
-
升序数组中求一个key出现的次数
2013-01-09 23:08 1117算法思路: 在排好序的数组,相同的数字是排列在一起的,所以只需 ... -
判断单链表是否有环
2013-01-08 19:07 931算法思路: 指针p1和p2的起始值均为链表的表头,指针p1每次 ... -
hdu3684
2011-11-15 20:11 943/* 刚开始打了个记录上下左右四个点的,一直tle。 ... -
hdu3686
2011-11-14 20:43 1042/* 无向图边的双连通分量,在同一个连通分量里的边之间 ... -
poj3968
2011-11-14 04:45 1426source: http://poj.org/problem ... -
uva2819
2011-11-13 02:20 909source: http://livearchive.onli ... -
manacher算法
2011-11-11 00:06 2441const int LEN=110005; const ... -
hdu4118
2011-11-09 21:53 1202枚举每条边最多被经过的次数即可 #include ... -
hdu4115
2011-11-09 16:27 1046source: http://acm.hdu.edu.cn/ ... -
zoj3500
2011-11-07 17:41 965求两个球的体积交或者并 #include <cs ... -
zoj3545
2011-11-04 18:18 873/* AC自动机 相当暴力的 解法: mark[i ... -
zoj3190
2011-11-04 17:34 1327/* * AC自动机,先对资源串和病毒串构成的字符串 ... -
zoj3228
2011-11-04 16:12 956/* * AC自动机,每个节点 添加一个d表示节点代 ... -
poj3691(DNA Repair)
2011-11-04 13:18 1490/* AC自动机,增设虚拟节点,求长度为n的字符串中包 ... -
hdu2825
2011-11-04 11:53 1002/* AC自动机,增设虚拟节点,求长度为n的字符 ... -
hdu4095
2011-11-03 13:19 1028/* 第一步,构建BST,用第一个数作为bst的 ... -
zoj3540
2011-11-02 21:33 937/* 其实就是把总共的 放置次数减去不能放置的那些就行 ... -
poj1741(树的分治,基于边的 分治)
2011-11-02 20:25 3365/* 树基于边的分治算法,计算树中距离小于等于k的点 ... -
hdu2939
2011-10-29 18:36 867source: http://acm.hdu.edu.cn/s ... -
hdu3982
2011-10-29 10:20 955//半平面交+多边形和圆的交的面积 #include ...
相关推荐
《计算二元关系的传递闭包》(On Computing the Transitive Closure of a Relation)涉及数学和编译器设计领域的核心概念。在数学中,传递闭包是通过添加最少的元素使一个二元关系具有传递性的过程。在编译器设计中...
传递闭包(Transitive Closure) 关节点(Articulation Point - UndiGraph) 拓扑排序(Topological Sort - AOV-Network) 关键路径(Critical Path - AOE-Network) 回路问题: 欧拉路(Euler Path), 汉密尔顿回路(Hamilton ...
本文研究了锦标赛图(tournament)中关于传递三元组(transitive triple)和传递四元组(transitive quadruple)的最大弧不相交(arc-disjoint)打包数量问题。作者Mohamad Kabiya与Raphael Yuster在论文中证明了在...
Aho Garey Ullman The transitive reduction of a directed graphAho Garey Ullman The transitive reduction of a directed graphAho Garey Ullman The transitive reduction of a directed graphAho Garey ...
Index A Acyclic graph 66 Adder CLA adder module 200 ...Transitive closure 68, 80 Tree 67 2’s complement notation 7 U Unions 20, 33 Unsigned notation 5 V Visualization 52
grTranClos - built the transitive closure for the digraph; grTravSale - solve the nonsymmetrical traveling salesman problem; grValidation - auxiliary function (the data validation); grTheoryTest - ...
交错群与旗传递$2-(v,k,4)$对称设计,董会莉,周胜林,本文研究旗传递的2-(v,k,4)对称设计的分类。证明了如果旗传递点本原的2-(v,k,4) 对称设计D的自同构群G的基柱为交错群An,其中n>=5, 则(v,k)=(15
- 关系的闭包: Reflexive closure, symmetric closure, transitive closure 等。 5. **代数结构**: - 群论:群的定义、运算性质、子群、同态。 - 环与域:加法和乘法结构的理解,整环、域的概念。 - 字母表和...
迁移学习-杨强-2015_Transitive_Transfer_Learning1 迁移学习是一种机器学习技术,通过利用源域的知识来增强目标域的学习能力。这种技术已经在各种应用中被证实是有效的。然而,迁移学习的一个主要限制是源域和目标...
We investigate the interaction between a ring R and the Cayley graph Cay(L(R)) of the semigroup of left ideals of R,as well as subdigraphs of this graph.Graph...such as transitive closure,girth,radius,di
在计算机科学中,传递闭包(Transitive Closure)是一个重要的概念,主要应用于图论和关系代数中。它表示在给定的关系集合中,通过一系列传递性步骤所能达到的所有连接。例如,在一个图中,如果节点A与节点B直接相连...
例如,一个旅程可以突出显示: 可以将Transitive地图作为独立的Web元素嵌入,也可以使用插件将其覆盖在地图上。 传递性得到 。 在阅读更多。故事书要查看实际中的Transitive样本, 。 您还可以在本地运行此命令: ...
受人类传递性推理和学习能力的启发,利用辅助概念将两个看似无关的概念通过一系列中间桥连接起来,本文研究了一个新的学习问题:传递性转移学习(transitive Transfer learning,简称TTL)。TTL的目的是在源域和目标...
* Transitive Closure and Reduction Computational Geometry: * Convex Hull * Triangulation * Voronoi Diagrams * Nearest Neighbor Search * Range Search Set and String Problems: * Set Cover * Set ...
- **4.2.3 Transitive Closure**: 求关系的传递闭包,找到所有可以通过有限次传递步骤到达的元素对。 - **4.3 Equivalence Relations**: 等价关系需满足自反性、对称性和传递性,证明一个关系是等价关系,需要分别...
3. 传递闭包(Transitive Closure): 传递闭包t(R)确保了如果a与b有关系,b又与c有关系,那么a与c也具有关系。在这个例子中,, b>和, c>都在R中,所以t(R)会添加, c>这一对,即使它没有在原始的R中出现。所以t(R)={,...
这通常通过传递闭包(Transitive Closure)来实现,即如果A与B相似,B与C相似,那么A与C也相似。`TransitiveClosure.m` 文件很可能包含了实现模糊等价矩阵的传递闭包算法。 在实际应用中,模糊等价矩阵可以用来定义...
3. 图论(Graph Theory):涉及到连通分支(Connected Components)、拓扑排序(Topological Sorting)、最小生成树(Minimum Spanning Tree)、最短路径(Shortest Path)、传递闭包(Transitive Closure and ...
这段代码是用C++语言实现的一个程序,用于计算和验证传递闭包(Transitive Closure)的概念,这在图论和关系代数中是常见的概念。传递闭包是指在一个二元关系R上,如果存在元素a、b、c,使得a与b之间有关系R,且b与c...