UVA 11324 The Largest Clique (强连通分量,dp)
给出一个有向图,求一个最大的结点集合,任意两个点u,v。u可到达v或v可到达u。
一个强连通分量肯定一起选的。而且只能在一条路径上。
所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG上的dp。
注意0,0这组数据
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn = ,maxm = 5e5+;
- int head[maxn],to[maxm],nxt[maxm];
- void addEdge(int u,int v,int i)
- {
- to[i] = v;
- nxt[i] = head[u];
- head[u] = i;
- }
- int pre[maxn],low[maxn],sccno[maxn],dfs_clock,scc_cnt;
- stack<int> stk;
- void tarjan(int u)
- {
- pre[u] = low[u] = ++dfs_clock;
- stk.push(u);
- for(int i = head[u]; ~i; i = nxt[i]){
- int v = to[i];
- if(!pre[v]){
- tarjan(v);
- low[u] = min(low[u],low[v]);
- }else if(!sccno[v]){
- low[u] = min(low[u],pre[v]);
- }
- }
- if(pre[u] == low[u]){
- scc_cnt++;
- while(stk.size()){
- int x = stk.top(); stk.pop();
- sccno[x] = scc_cnt;
- if(x == u) break;
- }
- }
- }
- void find_scc(int n)
- {
- memset(pre,,sizeof(pre));
- memset(sccno,,sizeof(sccno));
- dfs_clock = scc_cnt = ;
- for(int i = ; i < n; i++){
- if(!pre[i]) tarjan(i);
- }
- }
- vector<int> G[maxn];
- int wei[maxn], deg[maxn];
- void buildDAG(int n)
- {
- for(int i = ; i <= scc_cnt; i++) G[i].clear(),deg[i] = wei[i] = ;
- for(int u = ; u < n; u++){
- int v0 = sccno[u]; wei[v0]++;
- for(int i = head[u]; ~i; i = nxt[i]){
- int v1 = sccno[to[i]];
- if(v0 != v1) G[v0].push_back(v1),deg[v1]++;
- }
- }
- }
- int dp[maxn];
- int topo()
- {
- memset(dp,-,sizeof(dp));
- queue<int> q;
- for(int i = ; i <= scc_cnt; i++){
- if(!deg[i]) q.push(i),dp[i] = wei[i];
- }
- while(q.size()){
- int u = q.front(); q.pop();
- for(int i = ; i < (int)G[u].size(); i++){
- int v = G[u][i];
- dp[v] = max(dp[v],dp[u]+wei[v]);
- if(--deg[v] == ) q.push(v);
- }
- }
- int ans = ;
- for(int i = ; i <= scc_cnt; i++){
- ans = max(dp[i],ans);
- }
- return ans;
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- int T; scanf("%d",&T);
- while(T--){
- int n,m;
- memset(head,-,sizeof(head));
- scanf("%d%d",&n,&m);
- for(int i = ; i < m; i++){
- int u,v; scanf("%d%d",&u,&v);
- addEdge(u-,v-,i);
- }
- find_scc(n);
- buildDAG(n);
- printf("%d\n",topo());
- }
- return ;
- }
UVA 11324 The Largest Clique (强连通分量,dp)的更多相关文章
- UVa 11324 The Largest Clique (强连通分量+DP)
题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...
- UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)
题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...
- uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...
- UVA11324 The Largest Clique[强连通分量 缩点 DP]
UVA - 11324 The Largest Clique 题意:求一个节点数最大的节点集,使任意两个节点至少从一个可以到另一个 同一个SCC要选一定全选 求SCC 缩点建一个新图得到一个DAG,直 ...
- UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP
题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...
- uva 11324 The Largest Clique
vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...
随机推荐
- Flutter实战视频-移动电商-05.Dio基础_引入和简单的Get请求
05.Dio基础_引入和简单的Get请求 博客地址: https://jspang.com/post/FlutterShop.html#toc-4c7 第三方的http请求库叫做Dio https:/ ...
- 爬虫代码实现六-Queue队列实现循环抓取
StartDSJCount : package com.dajiangtai.djt_spider.start; import java.util.List;import java.util.Queu ...
- PHP实用小程序(一)
<? //设置路径(默认当前php文件所在路径) $basedir = "d:/inetpub/wwwroot"; $textrows = "20"; $ ...
- 两个MATLAB在线工具,画图啥的都不用安装了
1. matlab网页版 http://octave-online.net/ http://www.compileonline.com/execute_matlab_online.php 2. 函 ...
- POJ 3067【树状数组】
题意: 给你两行数字,n个m个,然后给你k条线直接把两个数连起来,问有多少个交叉的 思路: 假定上一行是起点,下一行是终点. 把路按照起点从大到下排序, 然后可以直接对每条路查询,这条路目前的交叉数, ...
- [Xcode 实际操作]一、博主领进门-(15)读取当前应用的信息
目录:[Swift]Xcode实际操作 本文将演示读取当前应用的配置信息. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...
- 调用Web API将文件上传到服务器的方法(.Net Core)
最近遇到一个将Excel通过Web API存到服务器的问题,其中涉及到Excel的读取.调用API.Web API怎么进行接收. 一. Excel的读取.调用API Excel读取以及调用API的代 ...
- seq(2018.10.24)
一道\(dp\)题... 期望\(40\)分解法 预处理:离散化,然后让连续一段值相同的元素合并为一个元素. 正式\(DP\): 显然有个最差策略为每个元素处都切一次,则切的次数为元素的个数\(-1\ ...
- python异常之ModuleNotFoundError: No module named 'test01inner02'
当我们使用sys.path.append(args) 指令向程序中导入模块时其实本次append操作只是在内存中完成的,如果要永久性的添加需要修改环境变量. 我们发现当我们使用print(sys.pa ...
- 25 Groovy 相关资料
Groovy Homepage Groovy API page Groovy documentation Groovy Goodness blog series from Hubert Klein I ...