UVA - 11324 The Largest Clique

3D视觉-结构光测量-线结构光测量 线结构光测量中,由激光器射出的激光光束透过柱面透镜扩束,再经过准直,产生一束片状光。这片光束像刀刃一样横切在待测物体表面,因此线结构光法又被成为光切法。线结构光测量常采用二维面阵CCD作为接受器件,因此只要通过增加垂直于面阵探测器的第三维度方向,就可以实现对三维物体的测量。 阅读详情

给定一个图,求一个节点数目最多的团,对于其中任意两个节点u,v至少存在一条这样的路径使得u到v,或者v到u。

分析: 先求出强连通分量,然后缩点,构成一个scc图,然后求一条最长的路,每个节点的权重即为该强连通分量的节点数目,由于是DAG, 所以可以用dp或者spfa,一开始用记忆化搜索竟然TLE,想也想不通,后来改成spfa,以0为起点,然后求出距离0的最大距离。

spfa:

  1 #include <iostream>
  2 #include <sstream>
  3 #include <cstdio>
  4 #include <climits>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <string>
  8 #include <stack>
  9 #include <map>
 10 #include <cmath>
 11 #include <vector>
 12 #include <queue>
 13 #include <algorithm>
 14 #define esp 1e-6
 15 #define pi acos(-1.0)
 16 #define pb push_back
 17 #define mp(a, b) make_pair((a), (b))
 18 #define in  freopen("in.txt", "r", stdin);
 19 #define out freopen("out.txt", "w", stdout);
 20 #define print(a) printf("%d\n",(a));
 21 #define bug puts("********))))))");
 22 #define stop  system("pause");
 23 #define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++)
 24 
 25 #define inf 0x0f0f0f0f
 26 
 27 using namespace std;
 28 typedef long long  LL;
 29 typedef vector<int> VI;
 30 typedef pair<int, int> pii;
 31 typedef vector<pii,int> VII;
 32 typedef vector<int>:: iterator IT;
 33 const int maxn = 5000;
 34 int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
 35 int a[maxn], dp[maxn], dis[maxn], inq[maxn];
 36 VI g[maxn], G[maxn];
 37 stack<int> S;
 38 void dfs(int u)
 39 {
 40     S.push(u);
 41     lowlink[u] = pre[u] = ++dfs_clock;
 42     for(int i = 0; i < g[u].size(); i++)
 43     {
 44         int  v = g[u][i];
 45         if(!pre[v])
 46         {
 47             dfs(v);
 48             lowlink[u] = min(lowlink[u], lowlink[v]);
 49         }
 50         else if(!sccno[v])
 51         {
 52             lowlink[u] = min(lowlink[u], pre[v]);
 53         }
 54     }
 55     int cnt= 0;
 56     if(lowlink[u] == pre[u])
 57     {
 58         scc_cnt++;
 59         for(;;)
 60         {
 61             int x = S.top();
 62             S.pop();
 63             cnt++;
 64             sccno[x] = scc_cnt;
 65             if(x ==  u)
 66             {
 67                 a[scc_cnt] = cnt;
 68                 break;
 69             }
 70         }
 71     }
 72 }
 73 void find_scc(int n)
 74 {
 75     memset(pre, 0, sizeof(pre));
 76     memset(sccno, 0, sizeof(sccno));
 77 
 78     dfs_clock = scc_cnt = 0;
 79     for(int i = 0; i < n; i++)
 80         if(!pre[i]) dfs(i);
 81 }
 82 void spfa(void)
 83 {
 84     memset(inq, 0, sizeof(inq));
 85     memset(dis, 0, sizeof(dis));
 86     queue<int> q;
 87     inq[0] = 1;
 88     q.push(0);
 89     while(!q.empty())
 90     {
 91         int u = q.front();
 92         q.pop();
 93         inq[u] = 0;
 94         for(int i = 0; i < G[u].size(); i++)
 95         {
 96             int v = G[u][i];
 97             if(dis[v] < dis[u] + a[v])
 98                 if(dis[v] = dis[u] + a[v], !inq[v])
 99                     inq[v] = 1, q.push(v);
100         }
101     }
102 }
103 int main(void)
104 {
105     int n, m;
106     int T;
107     for(int t = scanf("%d", &T); t <= T; t++)
108     {
109         for(int i = 0; i < maxn; i++)
110             g[i].clear(), G[i].clear();
111         scanf("%d%d", &n, &m);
112         memset(a, 0, sizeof(a));
113         while(m--)
114         {
115             int u, v;
116             scanf("%d%d", &u, &v);
117             u--, v--;
118             g[u].pb(v);
119         }
120         find_scc(n);
121         for(int u = 0; u < n; u++)
122             for(int i = 0; i < g[u].size(); i++)
123             {
124                 int v = g[u][i];
125                 if(sccno[v] != sccno[u])
126                     G[sccno[u]].pb(sccno[v]);
127             }
128         for(int i = 1; i <= scc_cnt; i++)
129             G[0].pb(i);
130         spfa();
131         int ans = 0;
132         for(int i = 1; i <= scc_cnt; i++)
133             ans = max(ans, dis[i]);
134         printf("%d\n", ans);
135     }
136     return 0;
137 }
View Code

下面是dp代码,一开始用的邻接矩阵存储关系图,后来改成邻接表果断过了,以后要注意了,尽量用邻接表

  1 #include <iostream>
  2 #include <sstream>
  3 #include <cstdio>
  4 #include <climits>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <string>
  8 #include <stack>
  9 #include <map>
 10 #include <cmath>
 11 #include <vector>
 12 #include <queue>
 13 #include <algorithm>
 14 #define esp 1e-6
 15 #define pi acos(-1.0)
 16 #define pb push_back
 17 #define mp(a, b) make_pair((a), (b))
 18 #define in  freopen("in.txt", "r", stdin);
 19 #define out freopen("out.txt", "w", stdout);
 20 #define print(a) printf("%d\n",(a));
 21 #define bug puts("********))))))");
 22 #define stop  system("pause");
 23 #define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++)
 24 
 25 #define inf 0x0f0f0f0f
 26 
 27 using namespace std;
 28 typedef long long  LL;
 29 typedef vector<int> VI;
 30 typedef pair<int, int> pii;
 31 typedef vector<pii,int> VII;
 32 typedef vector<int>:: iterator IT;
 33 const int maxn = 5000;
 34 int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
 35 int a[maxn], dp[maxn], dis[maxn], inq[maxn];
 36 VI g[maxn], G[maxn];
 37 stack<int> S;
 38 void dfs(int u)
 39 {
 40     S.push(u);
 41     lowlink[u] = pre[u] = ++dfs_clock;
 42     for(int i = 0; i < g[u].size(); i++)
 43     {
 44         int  v = g[u][i];
 45         if(!pre[v])
 46         {
 47             dfs(v);
 48             lowlink[u] = min(lowlink[u], lowlink[v]);
 49         }
 50         else if(!sccno[v])
 51         {
 52             lowlink[u] = min(lowlink[u], pre[v]);
 53         }
 54     }
 55     int cnt= 0;
 56     if(lowlink[u] == pre[u])
 57     {
 58         scc_cnt++;
 59         for(;;)
 60         {
 61             int x = S.top();
 62             S.pop();
 63             cnt++;
 64             sccno[x] = scc_cnt;
 65             if(x ==  u)
 66             {
 67                 a[scc_cnt] = cnt;
 68                 break;
 69             }
 70         }
 71     }
 72 }
 73 void find_scc(int n)
 74 {
 75     memset(pre, 0, sizeof(pre));
 76     memset(sccno, 0, sizeof(sccno));
 77 
 78     dfs_clock = scc_cnt = 0;
 79     for(int i = 0; i < n; i++)
 80         if(!pre[i]) dfs(i);
 81 }
 82 void spfa(void)
 83 {
 84     memset(inq, 0, sizeof(inq));
 85     memset(dis, 0, sizeof(dis));
 86     queue<int> q;
 87     inq[0] = 1;
 88     q.push(0);
 89     while(!q.empty())
 90     {
 91         int u = q.front();
 92         q.pop();
 93         inq[u] = 0;
 94         for(int i = 0; i < G[u].size(); i++)
 95         {
 96             int v = G[u][i];
 97             if(dis[v] < dis[u] + a[v])
 98                 if(dis[v] = dis[u] + a[v], !inq[v])
 99                     inq[v] = 1, q.push(v);
100         }
101     }
102 }
103 int main(void)
104 {
105     int n, m;
106     int T;
107     for(int t = scanf("%d", &T); t <= T; t++)
108     {
109         for(int i = 0; i < maxn; i++)
110             g[i].clear(), G[i].clear();
111         scanf("%d%d", &n, &m);
112         memset(a, 0, sizeof(a));
113         while(m--)
114         {
115             int u, v;
116             scanf("%d%d", &u, &v);
117             u--, v--;
118             g[u].pb(v);
119         }
120         find_scc(n);
121         for(int u = 0; u < n; u++)
122             for(int i = 0; i < g[u].size(); i++)
123             {
124                 int v = g[u][i];
125                 if(sccno[v] != sccno[u])
126                     G[sccno[u]].pb(sccno[v]);
127             }
128         for(int i = 1; i <= scc_cnt; i++)
129             G[0].pb(i);
130         spfa();
131         int ans = 0;
132         for(int i = 1; i <= scc_cnt; i++)
133             ans = max(ans, dis[i]);
134         printf("%d\n", ans);
135     }
136     return 0;
137 }
View Code

 

【AN7581】AN7581 SDK编译环境搭建操作说明 安装编译需要的工具包。 阅读详情

相关推荐

Zoom AI 技术架构研究:联合式方法与多模态集成

通过 Zoom AI 开放平台,企业可以自定义 AI 模块 (如法律合规审查、客户反馈分析),扩展应用场景。这种开放平台策略使企业能够根据自身需求定制 AI 功能,满足特定业务需求。

shao.bing的专栏 1317

uva 11324 The Largest Clique

  vjudge 上题目链接:uva 11324   scc + dp,根据大白书上的思路:"同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它的结点数,则题目转化为求 SCC 图上权最大的路径。由于 SCC 图是一个 DAG, 可以用动态规划求解。"   一开始我理解成了求所有结点的权值和,后来才明白所求的结果一定是 scc 上...

aidiao7379的博客 160

2021-3-20组会 无监督训练下的音频分离 (音源分离) Unsupervised Audio Source Separation Using Generative Priors

0. 说明 一片具体论文的综述

ruclion的专栏 1349

UVA 11324 The Largest Clique

题目大意:给一张有向图,求一个结点数最大的结点集,使得该结点集中的任意两个结点u和v满足:要么u可以达v,要么v可以达u,(u,v相互可达也行)。 思路:不难发现,如果要使得结点数最大,那么同一个强连通分量中的点,要么全选,要么全不选,让每一个SCC结点的权等于它的结点数,则题目可以转换为求SCC图上权的最长路径,SCC图是DAG图,可以同动态规划求解。 一开始,Tarjan写错了,WA了2次

Wall_F的专栏 888

2019年数学建模美赛经验总结

北京时间2019年1月29号上午9时,数模美赛结束。美赛结束已经10多天了,我在这次竞赛中负责建模和编程,趁现在记忆还比较清晰,写下这篇博客记录第一次参加数学建模美赛的经历。 补更:2019年4月20日公布成绩,笔者最终获得了美赛一等奖 目录 1、基本情况 2、选题 3、分工合作 4、论文写作 5、建模 6、编程 7、入门资源 ...

Smallactive 7万+

Qualcomm平台下基于QSEE的指纹识别方案移植之四TA移植

本文只介绍TA移植的过程,不做技术分析,关于TA开发另做记录。 一、TA介绍 TA,Trusted application 可信应用,是运行于QSEE中的可执行程序。 指纹TA文件如下,形式一般是 xxx.mbn; xxx.b0 ~ xxx.b6, xxx.flist, xxx.mdt; xxx.mbn 可以理解为其它几个文件的集合,签名的时候用的就是这个文件,签完名之后,有对应的工具将它...

梦路遥 7548

『题解』UVa11324 The Largest Clique

原文地址 Problem Portal Portal1:UVa Portal2:Luogu Portal3:Vjudge Description Given a directed graph \(\text{G}\), consider the following transformation. First, create a new graph \(\text{T(G)}\) to have t...

weixin_30839881的博客 130

Open3D 计算点云基本特征

在 Open3D 中,可以通过 PCA(主成分分析)来求得点云的特征值和特征向量。然后基于这些特征值,进一步计算各种几何特征,如线性、平面性、球度等。

纵马踏花向自由 1606

UVA 11324 The Largest Clique

Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First, create a new graphT(G) to have the same vertex set as G. Create a directed edge betweentwo ver

u013023344的专栏 434

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

【异常】出现“‘git‘ 不是内部或外部命令,也不是可运行的程序”的错误

出现“‘git’ 不是内部或外部命令,也不是可运行的程序”的错误通常意味着 Git 没有被正确安装在你的系统上,或者其可执行文件的路径没有被添加到系统的环境变量中。

奶爸的编程之路,也就一周冷个三天 1389

[UVA 11324]The Largest Clique[SCC][缩点]

题目链接:[UVA 11324]The Largest Clique[SCC][缩点] 题意分析: 找到最多的节点集合,使得集合内任意两个点之间都有一条路径使得u->v或者v->u。输出该集合的结点个数。 解题思路: 有向图中,强连通分量中的点肯定是互相可达的,所以选择了其中的一个点,必定连通分量中其它的点也要选择,所以我们可以把这些点看作同一个点进行缩点。 那么原问题就变成,从图中找一

闲停 540

29.Labview界面设计 --- (下篇)自定义控件库、界面布局与外观设计

1.自定义控件外观(自定义控件)1.1 自定义外观库1.2 手动自定义控件外观2. 前面板控件布局方式(控件排布)2.1 模块化控制布局方式2.2 数据采集布局方式3. 前面板外观优化项(背景设计)3.1 前面板背景设计3.2 前面板窗口整理本节第一部分教大家安装一种可以直接用的自定义控件库,第二部分教大家如何自己设计控件并保存调用。

关注我,更多技术问题欢迎私聊~ 4781

UVA11324 The Largest Clique

有向图中寻找一个点最多的子图,使得任意两点均可达(至少存在一条路径由一点通向另一点) 关键词:建立scc缩点图、有向图任意两点可达的最大子图、dag图最长路径

acmer的随记 401

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UVA 11324 - The Largest Clique(强连通分量+缩点)

UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分量,构造出scc之后,缩点,每一个点的权值是集合点个数,然后做一遍dag找出最大权值路径就可以 代码: #include <cstdio> #in...

weixin_30685029的博客 74

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

UVA-The Largest Clique 11324

最大团, problem:给一个有向图G, 求一个节点数最大的点集, 使得该点集中的任意两个节点至少要有一条路径 -> 那么可知, G中的SCC要么都选, 要么都不选(不选是因为这是有向图选了之后的无法纳入范围), 那么问题就简单了 将每个SCC缩成一个点, 变成在DAG上DP -> code: #include #include #include #include usin

上班了开始工作在家没事做 373

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

The Largest Clique (uva11324)

求图的缩点 #include<bits/stdc++.h> using namespace std; struct my{ int v,next; }; const int maxn=10000+10; const int maxn1=100000+10; my bian[maxn1]; my bian2[maxn1]; stack<i...

allia990718的博客 103

uva 11324 - The Largest Clique(缩点 + dp)

Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First, create a new graph T(G) to have the same vertex set as G. Create a directed edge between two v

勿忘初衷 1570

uva 11324 - The Largest Clique(强联通图+拓扑)

题目链接:uva 11324 - The Largest Clique 强连通缩点后,以缩掉的节点数作为新点的权值,缩完点之后就是一张DAG图,然后做拓扑排序。 #include #include #include #include #include #include using namespace std; const int maxn = 1005; int

不慌不忙、不急不躁 573

Uva 11324 The Largest Clique

题意: 给你一张有向图G, 求一个最大的节点集,使得该节点集中任意两个点u, v,满足:u可以到达v, 或者v可以到达u(u、v相互到达也可以)。 分析: 在最优的方案中,每一个强连通分量中的点要么都选,要么都不选,那么我们就可以先把所有的强连通分量计算出来,然后再将不同的强连通分量建一个新图,则最优解就是一个Dag上的DP了 代码如下:#include<iostream> #include

Free keyboard 跳动的键盘 459

The Largest Clique UVA - 11324

题文:https://vjudge.net/problem/UVA-11324 题解:   这个题目首先可以发现,只要是一个强连通分量,要么都选,要么都不选,将点权看成强连通分量的点数,所以这个题目就转化成了DAG上的最大路。   稍微dp一下就好了。 代码: #include <cstdio> #include <iostream> #includ...

weixin_34321977的博客 110

UVA11324 The Largest Clique

通往另一个世界的虫洞 tarjan缩点+dp求最长路 #include #include #include #include using namespace std; struct edge{ int u, v, next; }e[55555]; const int N = 1111; int pre[N], lowlink[N], sccno[N], dfs_clock, sc

浅雨歌 922

UVA 11324 The Largest Clique (拆点+KM)

题意:有n个盒子,围城一个环,每个盒子里可能有糖果或无糖果,总糖果不超过N,要求,把盒子中糖果数超过1的移到无糖果的盒子中,问最少几步。 分析:把有糖果数为val的盒子,拆成val个装一个糖果的盒子,编号num1从1开始累加,但他们在同一点。然后就是与每个盒子匹配,用km,这里要求最少几步,就拿距离来建图。 w[i][j] 表示第i个糖果的盒子,到第j个盒子的距离,由于是求最少,那么w[i][

lianweicheng88的博客 396

UVa 11324 The Largest Clique (强连通分量,dp)

题目链接:https://vjudge.net/problem/UVA-11324 题意:给一张有向图G,求一个节点数最大的结点集,使得该结点集中任意两个结点u和v满足:要么u可以到达v,要么v可以到达u(或者u和v相互可达) 思路:首先求出图的强连通分量,并把其收缩点得到scc图,每个scc结点权值为它的节点数。则问题转化成了,给出一个DAG图,各点权值已知,求一条权值最大的路径,可以用dp

Interstellar_的博客 509
上一篇: UVALive - 4287 Proving Equivalences
下一篇: UVALive 3211 Now or later
rootial
博客等级 码龄15年 2粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值