每個點都只連向乙個點,所以最終的圖就是若干個基環樹,原問題等價於在基環樹中選出若干條互不相交的鏈,使鏈頂權值和最小,對每個基環樹dp即可。
樹型dp:設dp[i]表示點i及其子樹中的答案,mx[i]表示max,son為i的兒子,那麼dp[i]=∑(dp[son]-mx[i])+c[i]。複雜度o(n)
環上dp:先列舉環的起始點s,且s->pre(c)的邊斷掉。設f[i]為s~i的答案和,那麼f[i]=min+dp[i],前一種情況表示從i和pre(i)的邊斷掉,即從i處重開一條鏈;後一種情況表示不斷,那麼pre(i)的子樹就要與環上的主鏈斷開。複雜度o(n^2)。還可以優化到o(n)。
o(n^2)做法:
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
int maxn=100100;
int n,top,to[maxn],huan[maxn];
bool visit[maxn],pd,b[maxn];
ll ans=0,now,minf,c[maxn],dp[maxn],mx[maxn],f[maxn];
struct edge
*con[maxn];
bool tepan()
for(int i=1;i<=n;i++)
if(!visit[i]) return
0; return1;}
void ins(int x,int y)
void find(int v)
if(to[huan[1]]==v) pd=0;
visit[v]=0;
}void dfs(int v)
dp[v]-=mx[v];
}int p(int x)
int s(int x)
int main()
if (tepan()) ans=0;
else
ans+=now;
}
}printf("%lld\n",ans);
return
0;}
雅禮集訓 part1
目錄day2 市場實際上算上區間加法增長的部分值域也很低,對於區間整除最多做 log 次。所以直接線段樹暴力維護。記錄 矩陣為什麼我會預設可以用列給行染色啊?只能先搞出一行全黑,然後染完所有列。由於是給列染色,所以對於第 k 行,只要存在某一行的第 k 列是黑,就可以完成補色,且補色的步數一定。對於...
雅禮集訓01 06 T3 math
目錄給出 n,m,x,你需要求出下列式子的值 sum mk i n prod sin k i x 其中 ki 為正整數。由於答案非常大,你只需要輸出答案 保證不為 0 的正負 如果是負數輸出負號,否則輸出正號 和從左往右第乙個非 0 數字上的數字即可。input 第一行乙個整數 t 表示資料組數。對...
雅禮集訓 Day1 T3 畫作 解題報告
小 mathrm 的喜歡作畫,尤其喜歡僅使用黑白兩色作畫.畫作可以抽象成乙個 r times c 大小的 01 矩陣.現在小 mathrm 構思好了他的畫作,準備動筆開始作畫.初始時畫布是全白的,他每一次下筆可以將乙個四聯通的部分塗成黑色或白色.你需要告訴他,在給出的構思下,他最少需要下筆多少次才能...