拓撲排序最長鏈-P3119 [USACO15JAN]草鑒定Grass Cownoisseur

https://www.luogu.org/problem/show?pid=3119
本來我是來練習tarjan的,結果tarjan部分直接copy了,反而拓撲排序部分想了好久;
這道題SZB大神兩次就AC;
但我等到AC,寫好題解就只能洗洗睡了;
唉~
差距怎么這么大呢?;
這道題的題意就說,你可以改變一條邊的方向,去找到一個環,讓環上的點數最大;
網上的題解,大多都在嚷嚷tarjan+拓撲排序最長鏈;
我先講講什么是拓撲排序最長鏈把;


這里寫圖片描述
很顯然啊,上面的圖里,1~3的最長鏈是3;
我們考慮一下最樸素的dfs;
我們從1開始,先搜索到了3;
這個時候我們把1~3的最長鏈更新為 1-3,就是2個節點;
假如3出度有好多,那么凡是3后面的點我們都要遍歷一邊;
然后遍歷完3,我發現 1~3的最長鏈不是1-3而是1-2-3;
原先的1~3最長鏈的節點個數2被更新為3;
這個時候我們發現原來3連出去的點,他們與1的最長鏈都不是最優的;
所以我們又要dfs一遍;
這樣太煩了;
那怎么辦呢?
看到這里,我想您一定知道什么是拓撲排序最長鏈了;
對啊,假如我們搜索到3的時候先不去往后面搜索,先去遍歷2;
這樣1~3的最長鏈會被及時更新,3后面的節點就不用重復更新了;
其實這樣就是按照拓撲排序的順序去遍歷節點啊,不斷找入度為0的節點去更新其它節點;
這就是拓撲排序最長鏈


這道題就簡單了啊;
我先縮點一下,讓這個有環圖變成有向無環圖;
然后用一個dfs去算出那些點可以到達1;那些點會從1到達;
分別算出這些點到1的最長鏈,然后枚舉每一條邊,看看把這條邊反一下,加上兩端到1的最長鏈然后更新ans就好啦;
很顯然啊,這兩條鏈不會重復,因為他們的方向是不同的;
我的超級優美的代碼,60行!;

超級無敵大壓行!!!!

#include<cstdio>//cfb
#include<iostream>
#include<cstring>
using namespace std;
struct cs{int to,next;}a[100001];          //lin[i]是i再那個分量里面  sum[i]就是第i個分量有幾個點 d[i]是當前分量i的入度 
int head[100001],low[100001],tt[100001],q[100001],lin[100001],cc[100001][2],sum[100001],A[100001][1],d[100001];
bool in[100001],AA[100001][2];//AA[i][0]表示1是否可以到i,[1]是i是否可以到j;A[i][0/1]即他們的最長鏈 
int ll,n,m,x,y,z,t,nn,l,r,ans;
void init(int x,int y){a[++ll].to=y; a[ll].next=head[x]; head[x]=ll;}
void dfs(int x){
    tt[x]=++t; low[x]=t; q[++q[0]]=x; in[x]=1;
    for(int k=head[x];k;k=a[k].next){
        if(!tt[a[k].to])dfs(a[k].to);
        if(in[a[k].to])low[x]=min(low[x],low[a[k].to]); 
    }
    if(low[x]==tt[x]){
        nn++;
        while(1){
            in[q[q[0]]]=0;
            lin[q[q[0]]]=nn;    
            q[0]--; sum[nn]++;
            if(q[q[0]+1]==x)break;
        }
    }
}
void make(int x,int num){//然后用一個dfs去算出那些點可以到達1;那些點會從1到達;
    in[x]=1; AA[x][num]=1;
    for(int k=head[x];k;k=a[k].next){d[a[k].to]++; if(!in[a[k].to])make(a[k].to,num);}
}
void TP(int num){//拓撲排序
    r=1; q[1]=lin[1]; A[lin[1]][num]=0; 
    make(lin[1],num); 
    while(r>l){
        x=q[++l];
        for(int k=head[x];k;k=a[k].next){
            A[a[k].to][num]=max(A[a[k].to][num],A[x][num]+sum[a[k].to]);
            d[a[k].to]--;
            if(!d[a[k].to])q[++r]=a[k].to;
        }
    }
}
void S(){
    memset(q,0,sizeof q);memset(head,0,sizeof head);
    memset(d,0,sizeof d);memset(in,0,sizeof in);
    ll=0; r=l=0;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){scanf("%d%d",&cc[i][0],&cc[i][1]);init(cc[i][0],cc[i][1]);}
    for(int i=1;i<=n;i++)if(!tt[i])dfs(i);
    S(); for(int i=1;i<=m;i++){x=cc[i][0]; y=cc[i][1]; if(lin[x]!=lin[y])init(lin[x],lin[y]);} TP(0);
    S(); for(int i=1;i<=m;i++){x=cc[i][0]; y=cc[i][1]; if(lin[x]!=lin[y])init(lin[y],lin[x]);} TP(1);
    for(int i=1;i<=m;i++){
        x=lin[cc[i][0]]; y=lin[cc[i][1]];
        if(x==y||!AA[y][0]||!AA[x][1])continue;
        ans=max(ans,A[y][0]+A[x][1]);
    }
    printf("%d",ans+sum[lin[1]]);
}

轉載于:https://www.cnblogs.com/largecube233/p/6797932.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372872.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

談談父類和子類的隔離性

以前寫代碼知道要給類外設置訪問接口, 例如下例: 1 class Money2 {3 public:4 Money(int money) : m_curValue(money){}5 6 void store(int money) { m_curValue money;}7 void spent(int money){ m_curValue - money;}8 private:9 int m_curValue…

用于數據庫測試的DBUnit,Spring和注釋

如果您曾經嘗試用Java編寫數據庫測試&#xff0c;則可能會碰到DBUnit 。 DBUnit允許您設置和拆除數據庫&#xff0c;以便它包含可針對其編寫測試的一致行。 通常&#xff0c;您可以通過編寫一個簡單的XML文檔來指定要DBUnit插入的行&#xff0c;例如&#xff1a; <?xml ve…

阿里云centos 7.6安裝mysql_阿里云Centos7上安裝MySQL教程

1 基本安裝過程1.查看系統是否安裝了mysql軟件# rpm -qa|grep -i mysql2.將已經安裝過的軟件卸載掉。注意&#xff1a;這樣的卸載是不徹底&#xff0c;不過這里夠用了# yum remove 軟件名3.CentOS 7的yum源中默認是沒有mysql的。所以&#xff0c;為了解決這個問題我們首先下載安…

Struts2中數據封裝方式

一、通過ActionContext類獲取 public class ActionContextDemo extends ActionSupport { Override public String execute() throws Exception { //獲取ActionContext對象 ActionContext context ActionContext.getContext(); //調用getParameters…

第五章、搭建S3C6410開發板的測試環境

通過對本章的學習&#xff0c;我對s3c6410開發板的測試環境有了一定的認識&#xff0c;并掌握了如下的知識點&#xff1a;一、對于s3c6410這款開發板&#xff0c;它是一款低功耗、高性價比的處理器&#xff0c;它是基于ARM11的內核。二、不同開發板的區別主要在燒錄嵌入式系統的…

IBM JVM調整– gencon GC策略

本文將向您詳細介紹從Java虛擬機&#xff08;例如HotSpot或JRockit&#xff09;遷移到IBM JVM時重要的Java堆空間調整注意事項。 該調整建議基于我為我的一個IT客戶端執行的最新故障排除和調整任務。 IBM JVM概述 正如您可能從其他文章中看到的那樣&#xff0c;IBM JVM在某些方…

mysql主從配置錯誤_mysql主從配置失敗,主從通訊失敗

配置mysql主從的時候&#xff0c;檢查slave狀態&#xff0c;發現報錯信息&#xff0c;Error The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement on query.mysql> show slave status\G*************************** 1. r…

echarts如何顯示在頁面上

echarts如何顯示在頁面上 1.引入echarts的相關.js文件 <script src"js/echarts.min.js"></script> 2.新建一個div&#xff0c;style自己定&#xff0c;但必須要有width和height <div id"history_state" style"width: 400px;height: 20…

懶惰的JSF Primefaces數據表分頁–第2部分

頁面代碼非常簡單&#xff0c;沒有復雜性。 檢查“ index.xhtml”代碼&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www…

二分匹配之最大權值匹配算法---KM模板

百科&#xff1a;http://baike.baidu.com/link?urlvbM3H4XmfrsWfP-epdlR2sVKSNzOq4hXnWDqm5uo8fd7VWsF2SmhDV35XyVUDvVjvrtf42RUITJuNCHn-7_x6K 大神總結&#xff1a;http://www.cnblogs.com/skyming/archive/2012/02/18/2356919.html 代碼&#xff1a; 1 #include<stdio.h…

java實現報表_用存儲過程和 JAVA 寫報表數據源有什么弊端?

用存儲過程和 JAVA 寫報表數據源有什么弊端&#xff1f;跟著小編一起來一看一下吧&#xff01;我們在報表開發中經常會使用存儲過程準備數據&#xff0c;存儲過程支持分步計算&#xff0c;可以實現非常復雜的計算邏輯&#xff0c;為報表開發帶來便利。所以&#xff0c;報表開發…

SpringMVC學習筆記整理

SpringMVC學習筆記 以下是我整理的SpringMVC學習筆記&#xff1a; 導入jar包 一&#xff1a;springmvc工作流程。 ①. servlet容器初始化一個request請求 ②. DispatcherServlet分發器負責發送請求到映射器. ③. despatcherServlet把請求交給處理器映射Mapping&…

Java EE重新審視設計模式:異步

盡管您可能找不到作為設計模式列出的異步方法調用&#xff0c;但我還是值得一提。 因此&#xff0c;這是我的JavaEE Revisits設計模式系列的最后一篇文章。 異步方法調用只不過是多線程。 基本上&#xff0c;它是指將在單獨的線程中運行的方法調用&#xff0c;因此主&#xff0…

am335x watchdog

am335x watchdog 內核文檔kernel/Documentation/watchdog Qtaplex:~/kernel/7109/linux-3.2.0/Documentation/watchdog$ ll total 88 drwxrwxr-x 3 Qt Qt 4096 Jun 8 15:11 ./ drwxrwxr-x 94 Qt Qt 12288 Apr 28 13:09 ../ -rwxrwxr-x 1 Qt Qt 576 Nov 20 2013 00-INDEX -rwxrw…

springboot2 使用hikaridatasource 并測試_基于Spring Boot 2.x的后端管理網站腳手,源碼免費分享...

基于Spring Boot 2.x 的 Material Design 的后端管理網站腳手架 &#xff1a;提供權限認證 用戶管理 菜單管理 操作日志 等常用功能去繁就簡 重新出發基于Spring Boot 集成一些常用的功能&#xff0c;你只需要基于它做些簡單的修改即可。功能列表&#xff1a;權限認證權限管理用…

測試驅動開發–雙贏策略

敏捷從業人員談論測試驅動開發 &#xff08;TDD&#xff09;&#xff0c;所以許多關心代碼質量和可操作性的開發人員也是如此。 我曾幾何時&#xff0c;不久前設法閱讀了有關TDD的文章。 據我了解&#xff0c;TDD的關鍵是&#xff1a; 編寫測試&#xff0c;但失敗 代碼&#x…

設計模式學習(三)——裝飾器模式

前言 距離上一次正兒八經地寫隨筆已經有一段時間了&#xff0c;雖然2月10號有一篇關于泛型的小記&#xff0c;但是其實只是簡單地將自己的學習代碼貼上來&#xff0c;為了方便后續使用時查閱&#xff0c;并沒有多少文字和理解感悟。之所以在今天覺得有必要寫點東西&#xff0c;…

swift - 導航欄設置

話不多&#xff0c;直接貼代碼&#xff1a; let nav UINavigationController.init(rootViewController: viewController) nav.topViewController?.title title// 設置導航欄的標題 nav.navigationBar.tintColor .whiteColor()// 設置push出的導航欄的返回顏色(箭頭及文字) …

mysql5.6主從復制(讀寫分離)方案_MySQL5.6主從復制(讀寫分離)方案

MySQL5.6主從復制(讀寫分離)方案一、前言&#xff1a;為什么MySQL要做主從復制(讀寫分離)&#xff1f;通俗來講&#xff0c;如果對數據庫的讀和寫都在同一個數據庫服務器中操作&#xff0c;業務系統性能會降低。為了提升業務系統性能&#xff0c;優化用戶體驗&#xff0c;可以通…

在實踐中使用延遲隊列

通常&#xff0c;在某些情況下&#xff0c;當您有某種工作或作業隊列時&#xff0c;有必要不立即處理每個工作項或作業&#xff0c;而是要延遲一些時間。 例如&#xff0c;如果用戶單擊一個按鈕來觸發要完成的某項工作&#xff0c;而一秒鐘后&#xff0c;用戶意識到他/她錯了&a…