P3387 【模板】縮點

来源:http://www.cnblogs.com/zwfymqz/archive/2017/08/14/7356358.html
-Advertisement-
Play Games

題目背景 縮點+DP 題目描述 給定一個n個點m條邊有向圖,每個點有一個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。 允許多次經過一條邊或者一個點,但是,重覆經過的點,權值只計算一次。 輸入輸出格式 輸入格式: 第一行,n,m 第二行,n個整數,依次代表點權 第三至m+2行 ...


題目背景

縮點+DP

題目描述

給定一個n個點m條邊有向圖,每個點有一個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。

允許多次經過一條邊或者一個點,但是,重覆經過的點,權值只計算一次。

輸入輸出格式

輸入格式:

 

第一行,n,m

第二行,n個整數,依次代表點權

第三至m+2行,每行兩個整數u,v,表示u->v有一條有向邊

 

輸出格式:

 

共一行,最大的點權之和。

 

輸入輸出樣例

輸入樣例#1:
2 2
1 1
1 2
2 1
輸出樣例#1:
2

說明

n<=10^4,m<=10^5,|點權|<=1000 演算法:Tarjan縮點+DAGdp

 

為什麼要DP。。

跑完tarjan跑爆搜不就好了麽。

還有這題貌似要開兩個鄰接表存。

不然會產生衝突(當然也有可能是我太弱了2333)

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<stack>
  6 using namespace std;
  7 const int MAXN=800100;
  8 const int mod=998244353;
  9 inline void read(int &n)
 10 {
 11     char c='+';bool flag=0;n=0;
 12     while(c<'0'||c>'9') c=='-'?flag=1,c=getchar():c=getchar();
 13     while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();
 14 }
 15 struct node
 16 {
 17     int u,v,nxt;
 18     void cler()
 19     {u=v=nxt=0;}
 20 }edge[MAXN];
 21 int head[MAXN];
 22 int num=1;
 23 inline void add_edge(int x,int y)
 24 {
 25     edge[num].u=x;
 26     edge[num].v=y;
 27     edge[num].nxt=head[x];
 28     head[x]=num++;
 29 }
 30 struct node2
 31 {
 32     int u,v,nxt;
 33     void cler()
 34     {u=v=nxt=0;}
 35 }edge2[MAXN];
 36 int head2[MAXN];
 37 int num2=1;
 38 inline void add_edge2(int x,int y)
 39 {
 40     edge2[num2].u=x;
 41     edge2[num2].v=y;
 42     edge2[num2].nxt=head2[x];
 43     head2[x]=num2++;
 44 }
 45 int n,m;
 46 int dfn[MAXN];//時間順序
 47 int low[MAXN];
 48 stack<int>s;
 49 int tot=0;//總結點 
 50 int vis[MAXN];
 51 int color[MAXN];
 52 int colornum=0;
 53 int date[MAXN];// 每一個聯通分量里的權值
 54 int a[MAXN]; 
 55 int out;// 最終答案 
 56 int ans;// 當前答案 
 57 int dfs(int now)
 58 {
 59     if(vis[now])    return vis[now];
 60     vis[now]=date[now];
 61     int nowmax=0;
 62     for(int i=head2[now];i!=-1;i=edge2[i].nxt)
 63     {
 64         if(!vis[edge2[i].v])        dfs(edge2[i].v);
 65         nowmax=max(nowmax,vis[edge2[i].v]);
 66     }
 67     vis[now]+=nowmax;
 68     return vis[now];        
 69 }
 70 inline void tarjan(int now)
 71 {
 72     dfn[now]=low[now]=++tot;
 73     vis[now]=1;
 74     s.push(now);
 75     for(int i=head[now];i!=-1;i=edge[i].nxt)
 76     {
 77         if(!dfn[edge[i].v])    tarjan(edge[i].v),    low[now]=min(low[now],low[edge[i].v]);
 78         else if(vis[edge[i].v])    low[now]=min(low[now],dfn[edge[i].v]);
 79     }
 80     if(dfn[now]==low[now])
 81     {
 82         colornum++;
 83         int h;
 84         do
 85         {
 86             h=s.top();
 87             if(!color[s.top()])    color[s.top()]=colornum,date[colornum]+= a[s.top()];
 88             vis[s.top()]=0;    s.pop();
 89         }while(now!=h);
 90     }
 91 }
 92 int main()
 93 {
 94     read(n);read(m);
 95     memset(head,-1,sizeof(head));
 96     memset(head2,-1,sizeof(head2));
 97     for(int i=1;i<=n;i++)    read(a[i]);
 98     for(int i=1;i<=m;i++)
 99     {
100         int x,y;read(x);read(y);
101         add_edge(x,y);
102     }
103     for(int i=1;i<=n;i++)
104         if(!dfn[i])    tarjan(i);
105     
106     for(int i=1;i<=n;i++)
107         for(int j=head[i];j!=-1;j=edge[j].nxt)
108             if(color[i]!=color[edge[j].v])    add_edge2(color[i],color[edge[j].v]);
109     memset(vis,0,sizeof(vis));
110     for(int i=1;i<=colornum;i++)
111     {
112         if(!vis[i])
113             dfs(i),ans=max(ans,vis[i]);
114     }    
115     printf("%d",ans);
116     return 0;
117 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考 數據結構Java實現06 中綴表達式轉換為尾碼表達式 將中綴表達式轉化為尾碼表達式 Mycode 你以為我會寫註釋嗎?不可能的。 運行結果如下: 像我這種不拘小節的男人,是不會在意同優先順序運算順序的。 大概上,演算法是沒什麼錯誤的。 再附上一個程式,同樣不會寫註釋的。 自己憑本事寫的bug。 ...
  • 題目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gang are practicing jumping over hurdles. They are ge ...
  • 1.安裝svnyum install subversion 2.創建版本庫fengyu(版本庫的名字取來和你web項目的名字相同,否則你在伺服器檢出後會變成web項目里還有一層版本庫的目錄,裡面才是項目,名字相同的話就不用創建web項目目錄,直接在www下麵進行檢出就OK。)mkdir -p /va ...
  • 如果要應聘高級開發工程師職務,僅僅懂得Java的基礎知識是遠遠不夠的,還必須懂得常用數據結構、演算法、網路、操作系統等知識。因此本文不會講解具體的技術,筆者綜合自己應聘各大公司的經歷,整理了一份大公司對Java高級開發工程師職位的考核綱要,希望可以幫助到需要的人。 當前,市面上有《Java XX寶典》 ...
  • /** * @return int|mixed * $user 返回的時候是需要解密的 */ function is_login(){ $user = session('user_auth'); if (empty($user)) { return 0; } else { return sessio ...
  • 本次重構優化內容 1 前端頁面增加JS判斷 2 使用JSTL+EL替換JSP語句 3 Servlet增加用戶名是否重覆檢查 註冊頁面 userReg.jsp 後臺Servlet ...
  • 題目背景 令 夜 色 的 鐘 聲 響 起 令 黃 昏 (起 始) 的 鐘 聲 響 起 我 愛 (渴 望) 的 就 只 有 你 我 愛 ( 渴 望 ) 你 正因如此 獨自安靜地哭泣吧 正因如此 無論你在何處哭泣 我都會率先去迎接你 不存在何處 直至深夜(小小的你) 你存在此處 至美者(心顯崇高之人) ...
  • file類常用方法 delete()刪除此抽象路徑名錶示的文件和目錄。 equals()測試此抽象路徑名與給定對象是否相等。 exists()測試此抽象路徑名錶示的文件或目錄是否存在。 getName()返回由此抽象路徑名錶示的文件或目錄的名稱。 isDirectory()測試此抽象路徑名錶示的文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...