UVA 1324 The Largest Clique 最大团(强连通分量,变形)
题意:给一个有向图,要求找出一些点,使得这些点中的任意点对,要么可以互通,要么单向可达。
思路:最低只要求单向可达即可,即a->b都可以算进去。
强连通分量内的点肯定是满足要求的,可以全选,但是有多个强连通分量时就不行了,得有取舍。老方法,先缩点,缩完点后是没有环的存在的,所以就是拓扑图了。如果只给一个拓扑图,要求找一条链使得链上的点最多,那么可以用判断拓扑的方式,逐个将入度为0的点删除,且在删除的时候记录下最多有多少个点,删到最后一个点时就出结果了。这样的方法同样适用,只是每个点可能是缩点,而且要将这些缩点内的点数算上去而已。
实现:
(1)求强连通分量。
(2)统计缩点的度数并建(缩点)图。
(3)按判断拓扑图的方式来进行点数的统计。
1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 using namespace std; 5 const int N=1000+5; 6 const int INF=0x7f7f7f7f; 7 vector<int> vect[N], g[N]; //原图,缩点后的图 8 int n, m; 9 int dfn[N], lowlink[N], scc_no[N], dfn_clock, scc_cnt; //强连通分量必备 10 stack<int> stac; //强联通分量用栈 11 unordered_map<int,int> chu[N],ru[N]; //仅仅为了防止重复统计 12 int r[N]; //出入度 13 int num[N]; //强联通分量中的点数 14 int dp[N]; //答案 15 16 void DFS(int x) 17 { 18 stac.push(x); 19 dfn[x]=lowlink[x]=++dfn_clock; 20 for(int i=0; i<vect[x].size(); i++) 21 { 22 int t=vect[x][i]; 23 if(!dfn[t]) 24 { 25 DFS(t); 26 lowlink[x]=min(lowlink[x],lowlink[t]); 27 } 28 else if(!scc_no[t]) lowlink[x]=min(lowlink[x], dfn[t]); 29 } 30 if(lowlink[x]==dfn[x]) 31 { 32 ++scc_cnt; 33 while(true) 34 { 35 int t=stac.top();stac.pop(); 36 scc_no[t]=scc_cnt; 37 if(t==x) break; 38 } 39 } 40 } 41 42 43 int cal() 44 { 45 memset(dfn,0,sizeof(dfn)); 46 memset(lowlink,0,sizeof(lowlink)); 47 memset(scc_no,0,sizeof(scc_no)); 48 dfn_clock=scc_cnt=0; 49 for(int i=1; i<=n; i++) if(!dfn[i]) DFS(i); 50 51 if(scc_cnt==1) return n; 52 for(int i=1; i<=scc_cnt; i++) g[i].clear(),chu[i].clear(),ru[i].clear(); 53 for(int i=1; i<=n; i++) //统计度,建图 54 { 55 for(int j=0; j<vect[i].size(); j++) 56 { 57 int t=vect[i][j]; 58 if(scc_no[i]!=scc_no[t]) 59 { 60 if(!chu[scc_no[i]][scc_no[t]]) //还没出现过 61 { 62 chu[scc_no[i]][scc_no[t]]=1; 63 g[scc_no[i]].push_back(scc_no[t]); 64 } 65 ru[scc_no[t]][scc_no[i]]=1; 66 } 67 } 68 } 69 deque<int> que; 70 memset(r,0,sizeof(r)); 71 for(int i=1; i<=scc_cnt; i++) //统计出入度 72 { 73 r[i]=ru[i].size(); 74 if(!r[i]) que.push_back(i); 75 } 76 77 memset(num,0,sizeof(num)); 78 for(int i=1; i<=n; i++) num[scc_no[i]]++; //统计点数 79 80 memset(dp,0,sizeof(dp)); //按拓扑序来dp 81 int ans=0; 82 while(!que.empty()) 83 { 84 int siz=que.size(); 85 for(int i=0; i<siz; i++) //所有入度为0的节点 86 { 87 int t=que.front();que.pop_front(); 88 ans=max(ans,dp[t]+num[t]); 89 for(int j=0; j<g[t].size(); j++) //每条以t出发的边 90 { 91 int d=g[t][j]; 92 r[d]--; 93 if(!r[d]) que.push_back(d); 94 dp[d]=max(dp[d],dp[t]+num[t]); 95 } 96 } 97 } 98 return ans; 99 } 100 101 102 int main() 103 { 104 //freopen("input.txt", "r", stdin); 105 106 int t, a, b; 107 cin>>t; 108 while(t--) 109 { 110 scanf("%d%d", &n, &m); 111 for(int i=1; i<=n; i++) vect[i].clear(); 112 for(int i=0; i<m; i++) 113 { 114 scanf("%d%d",&a,&b); 115 vect[a].push_back(b); 116 } 117 cout<<cal()<<endl; 118 } 119 return 0; 120 }
AC代码
转载于:https://www.cnblogs.com/xcw0754/p/4630692.html
UVA 1324 The Largest Clique 最大团(强连通分量,变形)相关推荐
- The Largest Clique UVA - 11324( 强连通分量 + dp最长路)
这题 我刚开始想的是 缩点后 求出入度和出度为0 的点 然后统计个数 用总个数 减去 然而 这样是不可以的 画个图就明白了... 如果 减去度为0的点 那么最后如果出现这样的情况是不可 ...
- LRJ白书图论 11324 - The Largest Clique uva
/*题意:给一张有向图,求这样的一个点集,使得集合中的点u,v,u->v,or v->u,or,u<->v.对图缩点,构造一张DAG.在DAG上作dp最长路.点权为每个强连通分 ...
- UVA11324-- The Largest Clique(SCC+DP)
题目链接 题意:给出一张有向图,求一个结点数最大的结点集,使得该结点集中随意两个结点u和v满足:要么u能够到到v,要么v能够到达u(u和v能够互相到达) 思路:我们能够缩点,用Tarjan求出全部强连 ...
- UVAoj 11324 - The Largest Clique(tarjan + dp)
题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<==>v 思路:首先将强连通分量通过tarjan算法求出 ...
- Uva 247 - Calling Circles(传递闭包 / 强连通分量)
题目链接 https://vjudge.net/problem/UVA-247 [题意] 如果两个人直接或间接互相打电话,则说明他们在同一个电话圈里.例如a打给b,b打给c,c打给d,d打给a,则这4 ...
- UVA 11504 Dominos 强连通分量
找出强连通分量,缩点后统计入度为0的结点数. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include& ...
- 【C++】强连通分量
强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...
- 强连通分量(学习心得)
定义:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通如果有向图G的每两个顶点都强连通, ...
- 缩点(有向图的强连通分量)学习笔记
缩点(有向图的强连通分量)学习笔记 1.什么是强连通分量?: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路 ...
最新文章
- 设计模式之简单工厂模式(静态工厂方法)
- servlet向ajax传递list数据类型,ajax向servlet传递array数据类型
- 马斯克的“大脑改造计划”,还需要点亮哪些技能树?
- 怎么计算python程序执行时间_【华为云技术分享】计算python程序执行时间
- 报名 | AlphaGo Zero是如何实现无师自通的?
- c语言成绩等级switch语句,请高手 帮忙做一道c语言题 编程,把百分制成绩转换成5级记分制,要求用switch语句。 90分以上(包括90):...
- 1.9 编程基础之顺序查找 08 白细胞计数 python
- python基础语法中处理一组数据所使用的类型有哪些_python基本数据预处理语法函数(2)...
- 梦的解析 —— 梦知道答案
- matlab2c使用c++实现matlab函数系列教程-randint函数
- PyTorch中文版官方教程来了,附pdf下载
- (转)Aladdin PK SimCorp Dimension
- python如何解析xml请求 http_怎么用python处理xml请求和xml响应,wsdl, soap,希望有源码参考。...
- Java实现DFA算法敏感词过滤
- 一文搞懂深度学习所有工具——Anaconda、CUDA、cuDNN
- 蒙古文输入法linux版,蒙古文输入法下载 德力海蒙古文输入法 V2.1.3 官方安装版(附使用手册) 下载-脚本之家...
- unity shader projector使用
- threejs 效果合成器(EffectComposer)
- 山东职业学院计算机专业,山东职业学院最好的专业是什么(10大热门专业排名)...
- Mybatis - <choose> 标签的用法