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.pswp.cn/news/531604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531604.shtml
英文地址,請注明出處:http://en.pswp.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…