藍題,思路不算很難,題意可知強連通塊上每條邊的值都可一壓榨乾淨,其他邊最多走一次。因此先縮點,連通塊內所有邊的值先算出來,然後再重新構圖,這時候是個無環圖,跑一邊動態規劃輸出最大值即可。
#include
#define int long long
#define endl "\n"
#define maxn 1000005
using
namespace std;
struct edge
edge[maxn]
;int head[maxn]
,ptr;
void
add_edge
(int u,
int v,
int w,
double co)
int n,m,s;
int belong[maxn]
,scc;
int val[maxn]
;int dfn[maxn]
,low[maxn]
;int idx;
bool in_stk[maxn]
;stack<
int> stk;
void
tarjan
(int now)
else
if(in_stk[to]
) low[now]
=min
(low[now]
,dfn[to]);
}if(dfn[now]
==low[now]
)while
(temp!=now);}
}struct e
e[maxn]
;int
get(
int p)
void
dfs(
int now)
}signed
main()
cin>>s;
tarjan
(s);
ptr=0;
memset
(head,0,
sizeof
(head));
memset
(edge,0,
sizeof
(edge));
for(
int i=
1;i<=m;i++
)add_edge
(u,v,w,0)
;}dfs(belong[s]);
int ans=0;
for(
int i=
1;i<=scc;i++
) ans=
max(ans,val[i]);
cout<}
洛谷P2656 採蘑菇
include include include include include include using namespace std struct inter 200040 double hui 200040 bool flag 80080 int n,m,x,y,z,s,ans 80080 f1...
洛谷 P2656 採蘑菇(Tarjan縮點,dp)
對於每一條路,很顯然只有兩種情況,一種是走一次,一種是走無限次,而第二種情況的條件是這條邊在乙個環中。所以先用tarjan縮點,每個點的權值更新為這個環上所有邊一直摘的蘑菇數的和。然後跑一邊既有邊權也有點權的dag上的dp即可。資料有鍋,後四個點答案有誤,用double存實際上錯了,但是標程是dou...
暑假集訓每日一題 0725 (強連通分量)
n個學校之間有單向的網路,每個學校得到一套軟體後,可以通過單向網路向周邊的學校傳輸。問題1 初始至少需要向多少個學校發放軟體,使得網路內所有的學校最終都能得到軟體。問題2 至少需要新增幾條傳輸線路 邊 使任意向乙個學校發放軟體後,經過若干次傳送,網路內所有的學校最終都能得到軟體。輸入有多組樣例,大約...