tarjan dp P3387 模板 縮點

2021-10-08 10:25:53 字數 1010 閱讀 7891

可以多次走乙個點或一條邊,但只計算一次點權,意味著我們需要進行縮點

tarjan進行求強聯通分量主要記錄dfn[i],low[i],以及維護que記錄走過的點

通過後向邊和樹枝邊對low值的更新,當dfn[i]=low[i]時,就出現了強連通分量,可以進行縮點操作

在縮點後,重新建圖,然後就可以通過dp(記憶化) 進行統計

**

#includeusing namespace std;

const int maxn=1e4+5;

const int maxm=1e5+5;

int n,m,tot,inin[maxn],dp[maxn],ans,color[maxn],va[maxn],low[maxn],times,top,cnt,que[maxn],dfn[maxn],head[maxn],val[maxn],ux[maxm],uy[maxm];

struct edge

g[maxm<<1];

void add(int x, int y)

void tarjan(int x)

else if(inin[to])

low[x]=min(low[x],dfn[to]);

} if(dfn[x]==low[x]) }

}void ***(int x)

dp[x]+=maxsum;

}int main()

for(int i=1;i<=n;i++)

if(!dfn[i]) tarjan(i);

memset(head,0,sizeof(head));

cnt=0;

for(int i=1;i<=m;i++)

if(color[ux[i]]!=color[uy[i]])

add(color[ux[i]],color[uy[i]]);

for(int i=1;i<=tot;i++) }

printf("%d\n",ans);

return 0;

}

P3387 模板 縮點

r es ul tresult result h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 給定一張n nn個點,m mm條邊的有向圖,點有點權 找出一條路徑使得經過的點的權值和最大,點和邊可以重複...

Luogu P3387 模板 縮點

這個題不難,就是先trajan縮點減小點數和邊數的規模,然後在縮完點的圖上跑dp即可。注意要用toposort解決dp後效性 或者是使用記憶化搜尋 code include include include include define maxn 10010 define maxm 500100 in...

P3387 模板 縮點

縮點 dp 給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。輸入格式 第一行,n,m 第二行,n個整數,依次代表點權 第三至m 2行,每行兩個整數u,v,表示u v有一條有...