縮點 洛谷P3387

2022-08-18 23:48:15 字數 1384 閱讀 6024

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

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

第一行,n,m。第二行,n個整數,依次代表點權。第三至m+2行,每行兩個整數u,v,表示u->v有一條有向邊。

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

n<=104,m<=105,點權<=1000。

tarjan縮點+dag圖上的dp。

#include#include#include#include#include#include#define maxn 200005

#define inf 0x3f3f3f3f

using namespace std;

struct edgeedge[maxn],edge2[maxn];

stackstk;

int first[maxn],last[maxn],dfn[maxn],low[maxn],belong[maxn],rd[maxn],sum[maxn],w[maxn],first2[maxn],last2[maxn],dp[maxn];

int node,dfn_timeclock,cnt,node2,n,m,x,y,ans;

bool vis[maxn];

void addedge(int u,int v);

if(first[u]==0)first[u]=node;

else edge[last[u]].next=node;

last[u]=node;

}void addedge2(int u,int v);

if(first2[u]==0)first2[u]=node2;

else edge2[last2[u]].next=node2;

last2[u]=node2;

}void init()

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

}void tarjan(int s)

else if(!belong[j])

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

stk.pop(); }}

void set_new()

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

} }}void topo()

} while(!q.empty()) }}

int main()

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

return 0;

}

模板 縮點 洛谷p3387

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

洛谷P3387 模板 縮點

kma縮點之後很明顯是個dag,跑一遍toposort順便dp 方程 ans v max ans u w v ans v ans是到這個連通塊的最大點權和,w是這個連通塊的點權 注意縮點之後兩個連通塊之間可能會有很多邊,從連通塊內不同的點發出,正反分別只能連一次,否則toposort會涼 inclu...

洛谷P3387 (模板)縮點

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