允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。
第一行,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 表...