「BZOJ1232」 [Usaco2008Nov]安慰奶牛cheer


「BZOJ1232」 [Usaco2008Nov]安慰奶牛cheer

problem

Solution

最终的图显然是一棵树

把每条边视作两条有向边。在树的情况下,一定需要走完所有的有向边。除了出发点以外,走一条有向边\((u,v)\)对答案的贡献为\(w(u,v)+c[v]\),亦即每条无向边对答案的贡献为\(w(u,v)*2+c[u]+c[v]\),将其作为边权跑最小生成树。生成树的权值加上最小的点权即为答案

Code

#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 10005
#define maxm 100005
using namespace std;
typedef long long ll;
 
int n,m;
int c[maxn];
int ans;
 
struct edge
{
    int u,v,w;
}g[maxm];
 
int prt[maxn];
 
int getroot(int u)
{
    return prt[u]==u?u:prt[u]=getroot(prt[u]);
}
 
bool cmp(const edge &a,const edge &b)
{
    return a.w