UVAoj 11324 - The Largest Clique(tarjan + dp)

题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点
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

 

转载于:https://www.cnblogs.com/hujunzheng/p/4019695.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android开发蓝牙自动连接电脑上,Android蓝牙开发之自动连接设备

自动连接使用的是SharedPreferences这个来解决。private void Automaticconnection() {SharedPreferences sp getSharedPreferences("Dizhi", MODE_PRIVATE);String address sp.getString("address", "");if (!address.equals("")) …

hdu 2014鞍山赛区 5073 Galaxy

题意&#xff1a;就是给你 n 个数&#xff0c;代表n个星球的位置&#xff0c;每一个星球的重量都为 1 &#xff01; 开始的时候每一个星球都绕着质心转动&#xff0c;那么质心的位置就是所有的星球的位置之和 / 星球的个数 现在让你移动 k 个星球到任意位置&#xff08;多个星球…

android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener

大家好,有一个应用程序,可以在SD卡上保存音频.我创建了一个listview,它从sdcard中检索文件名.我正在尝试设置一个监听器,所以当单击文件名时,我可以启动另一个播放该文件的意图.当我尝试设置监听器并传入一个新的OnItemClickListener()时,eclipse是红色的下划线.我知道我必须实…

DRF之请求与响应

目录 一、模块与包回顾 二、反序列化校验源码分析(了解) 三、断言 四、drf之请求 【1】源码分析 【2】配置视图类能处理的编码格式 五、drf之响应 【1】源码 【2】响应编码格式 一、模块与包回顾 模块与包 什么是模块&#xff1f; 一个py文件&#xff0c;被别的py文件…

android 常用注解,Android 开发小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具。里面包含了 Android 开发中常用的代码检测注解&#xff0c;帮助开发者提高代码质量。通过 SDK Manager下载 Android Support Repository 后&#xff0c;在 Gradle 中通过如下声明…

codeforces B. Friends and Presents(二分+容斥)

题意&#xff1a;从1....v这些数中找到c1个数不能被x整除&#xff0c;c2个数不能被y整除&#xff01; 并且这c1个数和这c2个数没有相同的&#xff01;给定c1, c2, x, y&#xff0c; 求最小的v的值&#xff01; 思路&#xff1a; 二分容斥&#xff0c;二分找到v的值&#xff0c;…

android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述

音量控制键控制的音频流(setVolumeControlStream)描述2021-01-03 16:18Android教程网 Android当开发多媒体应用或者游戏应用的时候&#xff0c;需要使用音量控制键来设置程序的音量大小,在Android系统中有多种音频流,感兴趣的朋友可以了解下当开发多媒体应用或者游戏应用的时候…

eclipse的使用

eclipse如何打开一个已存在的工程&#xff01;先给eclipse创建一个workspace,这个workspace就是一个文件夹用来管理eclipse项目的&#xff0c;或者修改eclipse的workspace,选择菜单file->switch workspace->other,选择一个已经存在的workspace。将已经存在的项目导入到wo…

Android延伸布局到状态栏,Android 状态栏透明

前言&#xff1a;最近项目大量用到状态栏透明&#xff0c;网上也出现很多库可以直接拿来用&#xff0c;个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法)&#xff0c;所以研究了一番&#xff0c;在此做个记录加强记忆也便后期查阅&#xff0c;如果无意中有幸能…

glassfish服务器默认的网页所在的位置

http://localhost:8080/ 默认打开的网页所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 转载于:https://www.cnblogs.com/hujunzheng/p/4052920.html

华为HarmonyOS 鸿蒙,华为鸿蒙HarmonyOS2.0手机开发者Beta版正式发布

据悉&#xff0c;本次手机开发者Beta测试支持以下中国境内主制式手机及平板电脑。手机&#xff1a;全网通(5G双卡)P40 、 全网通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G)&#xff0c;型号清单为ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http协议客户端向服务器端请求时一般需要发送的内容

out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式&#xff0c;文件路径&#xff0c; http协议版本&#xff08;必写&#xff09;请求头.... out.println("Aceept: */*");//客户端能够处理的文件类型&#xff08;不是必须&#xff…

android oneshot自动播放bug,移动端常见bug汇总001

前言本文是摘录整理了移动端常见的一些bug以及解决方案&#xff0c;第一篇&#xff0c;后面还会有持续的文章更新整理。点击样式闪动Q: 当你点击一个链接或者通过Javascript定义的可点击元素的时候&#xff0c;它就会出现一个半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 与 Integer.class

TYPE 表示的引用类型所对应的基本类型的Class对象&#xff01; 转载于:https://www.cnblogs.com/hujunzheng/p/4055471.html

android uber启动动画,模仿Uber的启动画面(上)

启动画面(Splash Screen)——不但给开发者们提供了一个尽情发挥、创建有趣动画的机会&#xff0c;也填补了App启动时从终端慢吞吞地下载数据的时间。启动画面(动态的)对于App至关重要&#xff1a;它可以让用户不失兴趣地耐心等待应用完成加载。尽管现在的启动画面多种多样&…

java中产生对象的两种方式

/** 普通new对象的过程&#xff01;*/Person pp new Person();System.out.println(pp);/** 利用代用参数的构造器产生对象实例&#xff01;* 首先获得相应带参数的构造器&#xff0c;然后利用构造器产生对象实例&#xff01;*/pclass Class.forName("get_class_method.P…

智慧屏用鸿蒙的生态,紧随鸿蒙OS手机版 ,智慧屏为什么对鸿蒙生态这么重要?...

原标题&#xff1a;紧随鸿蒙OS手机版 &#xff0c;智慧屏为什么对鸿蒙生态这么重要&#xff1f;12 月 21 日&#xff0c;华为正式发布了两款智慧屏新品&#xff0c;智慧屏 S 系列和车载智慧屏&#xff0c;前者是智慧屏的新系列&#xff0c;后者则是新开辟的车机产品线。没有意外…

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因为age成员变量是私有的&#xff0c;所以会产生NoSuchFieldException异常Field ageField pclass.getDeclaredField("age");//获得该对象反映此…

MySQL不能插入中文字符及中文字符乱码问题

MySQL的默认编码是Latin1&#xff0c;不支持中文&#xff0c;要支持中午需要把数据库的默认编码修改为gbk或者utf8。在安装后MySQL之后&#xff0c;它的配置文件不是很给力&#xff0c;不知道你们的是不是&#xff0c;反正我的是&#xff01; 开始插入中文字符的时候出现如下错…

android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...

---coding by yuangu(lifulinghanaol.com)--用于计算2个pgs之间的距离function computeDistance(lat1, lon1,lat2, lon2)-- Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf-- using the "Inverse Formula" (section 4)local MAXITERS 20;-- Convert lat/lo…