UVAoj 11324 - The Largest Clique(tarjan + dp)

简介: 题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者uv 思路:首先将强连通分量通过tarjan算法求出来,然后进行缩点,也就是每一个缩点 所组成的图就是一个DAG图!令每一个点的权值就是这个缩点所包含节点(也就是对应的 强连通分量的节...

题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点
u,v, 都有u->v 或者 v->u 或者u<==>v

思路:首先将强连通分量通过tarjan算法求出来,然后进行缩点,也就是每一个缩点
所组成的图就是一个DAG图!令每一个点的权值就是这个缩点所包含节点(也就是对应的
强连通分量的节点数目),因为强连通分量的任意的两个节点都是相互可达的,那么这个
缩点要么选要么不选,问题就转换成了DAG图上的最长路径!

  1 #include<iostream>
  2 #include<queue>
  3 #include<stack>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<algorithm>
  7 #include<vector>
  8 #define N 1005
  9 using namespace std;
 10 
 11 struct EDGE{
 12     int u, v, nt;
 13     EDGE(){}
 14     EDGE(int u, int v, int nt) : u(u), v(v), nt(nt){}
 15 };
 16 
 17 int first[N];
 18 vector<EDGE>g;
 19 vector<EDGE>gg;
 20 int scc_cnt, dfs_clock;
 21 int scc[N];
 22 int pre[N], low[N];
 23 int dp[N], cnt[N];
 24 
 25 int in[N];
 26 int n, m;
 27 stack<int>s;
 28 
 29 void dfs(int u){
 30     pre[u] = low[u] = ++dfs_clock;
 31     s.push(u);
 32     for(int i = first[u]; ~i; i = g[i].nt){
 33         int v = g[i].v;
 34         if(!pre[v]){
 35             dfs(v);
 36             low[u] = min(low[u], low[v]);
 37         }else if(!scc[v])
 38             low[u] = min(low[u], pre[v]);
 39     }
 40     if(low[u] == pre[u]){
 41         ++scc_cnt;
 42         while(1){
 43             ++cnt[scc_cnt];
 44             int x = s.top(); s.pop();
 45             scc[x] = scc_cnt;
 46             if(x==u) break;
 47         }
 48     }
 49 }
 50 
 51 void addEdge(int u, int v){
 52     g.push_back(EDGE(u, v, first[u]));
 53     first[u] = g.size() - 1;
 54 }
 55 
 56 void tarjans(){
 57     memset(pre, 0, sizeof(pre));
 58     memset(scc, 0, sizeof(scc));
 59     memset(cnt, 0, sizeof(cnt));
 60     memset(dp, 0, sizeof(dp));
 61     memset(in, 0, sizeof(in));
 62     scc_cnt = 0;
 63     dfs_clock = 0;
 64     for(int i=1; i<=n; ++i)
 65         if(!pre[i]) dfs(i);
 66     int len = g.size();
 67     memset(first, -1, sizeof(first));
 68     gg.clear();
 69     for(int i=0; i<len; ++i)
 70         if(scc[g[i].u] != scc[g[i].v]){
 71              in[scc[g[i].v]]++;
 72              gg.push_back(EDGE(scc[g[i].u], scc[g[i].v], first[scc[g[i].u]]));
 73              first[scc[g[i].u]] = gg.size() - 1;
 74         }
 75     int maxN = 0;    
 76     queue<int>q;
 77     for(int i=1; i<=scc_cnt; ++i)
 78         if(!in[i]){
 79            dp[i] = cnt[i];
 80            q.push(i);
 81            if(maxN < dp[i]) maxN = dp[i];
 82         }
 83     while(!q.empty()){
 84         int u = q.front(); q.pop();
 85         for(int i=first[u]; ~i; i = gg[i].nt){
 86             int v = gg[i].v;
 87             dp[v] = max(dp[v], dp[u] + cnt[v]);
 88             q.push(v);
 89             if(maxN < dp[v]) maxN = dp[v];
 90         }
 91     }
 92     printf("%d\n", maxN); 
 93 }
 94 
 95 int main(){
 96     int t;
 97     scanf("%d", &t);
 98     while(t--){
 99         memset(first, -1, sizeof(first));
100         scanf("%d%d", &n, &m);
101         while(m--){
102             int u, v;
103             scanf("%d%d", &u, &v);
104             addEdge(u, v);
105         }
106         tarjans();    
107         g.clear();
108     }
109     return 0;
110 } 
View Code

 

目录
相关文章
|
6月前
|
SQL API 数据库
【LangGraph新手村系列】(4)人机协作中断:让 Agent 在关键节点停下来等你
解决"全自动Agent无法审查"的问题。在tools节点前插入interrupt_before中断点,改用stream流式运行实现暂停,通过get_state().next判断中断位置,审查工具调用后用Command(resume=True)恢复执行,实现人机协作的三重干预:审查放行、修改参数、拒绝执行。
722 0
|
人工智能 安全 程序员
通义灵码发布繁星计划,面向校园开发者永久免费
通义灵码发布繁星计划,面向校园开发者永久免费
|
SQL Web App开发 网络安全
渗透测试-浏览器插件-Hackbar的安装与使用教程
渗透测试-浏览器插件-Hackbar的安装与使用教程
渗透测试-浏览器插件-Hackbar的安装与使用教程
|
Apache 项目管理 流计算
祝贺!两位 Apache Flink PMC 喜提 Apache Member
目前,国内(华人)近 30 位 Apache Member 中,有 3 位是 Apache Flink 的核心贡献者。他们热爱开源也为开源贡献,不仅积极参与社区与其他 PMC 成员共同规划、主导 Apache Flink 的发展,更活跃在多个开源项目,持续为开源社区做贡献。
|
存储 自然语言处理 数据可视化
决策树模型算法研究与案例分析
决策树算法是一种基本的分类与回归方法,是最经常使用的算法之一。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是基于规则的集合。本文首先介绍决策树定义、工作原理、算法流程、优缺点等,然后结合案例进行分析。(本文原创,转载必须注明出处: 决策树模型算法研究与案例分析)
10633 273
深入探讨java -jar命令:详解及代码演示
深入探讨java -jar命令:详解及代码演示
|
存储 程序员 编译器
STM32的内存管理相关(内存架构,内存管理,map文件分析)
STM32 的内存架构,内存管理以及 map 文件分析
925 0
STM32的内存管理相关(内存架构,内存管理,map文件分析)
|
算法 Serverless
m基于优化算法的多车辆的路径规划matlab仿真,对比GA,PSO以及烟花算法
m基于优化算法的多车辆的路径规划matlab仿真,对比GA,PSO以及烟花算法
388 0
m基于优化算法的多车辆的路径规划matlab仿真,对比GA,PSO以及烟花算法
|
机器学习/深度学习 编解码 运维
YOLO系列改进 | YOLOF的小小改进升级之轻量化TE-YOLOF
YOLO系列改进 | YOLOF的小小改进升级之轻量化TE-YOLOF
484 0
|
算法 数据处理 调度
路由器你竟然是这样的...(一)
前面我们学习了运输层如何为客户端和服务器输送数据的,提供进程端到端的通信。那么下面我们将学习网络层实际上是怎样实现主机到主机的通信服务的。几乎每个端系统都有网络层这一部分。所以,网络层必然是很复杂的。下面我将花费大量篇幅来介绍一下计算机网络层的知识。
路由器你竟然是这样的...(一)

热门文章

最新文章