国外优惠卷网站如何做htm5网站
国外优惠卷网站如何做,htm5网站,学技术网站,散文网站模板无向图联通分量
点u是割点#xff0c;当且仅当
特判树根#xff1a;u为树根#xff0c;且u有多于1棵子树u不为树根#xff0c;在递归树上u存在子节点v#xff0c;满足#xff1a;dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu≤lowv 如上图#xff0c;v想走到u的组…无向图联通分量
点u是割点当且仅当
特判树根u为树根且u有多于1棵子树u不为树根在递归树上u存在子节点v满足dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu≤lowv 如上图v想走到u的组先必须经过u那么u一定是割点。 边(u,v)(u,v)(u,v)是割边当且仅当边(u,v)(u,v)(u,v)为树边且满足dfnulowv⇔dfnvlowv\text{dfn}_u \text{low}_v\Leftrightarrow \text{dfn}_v \text{low}_vdfnulowv⇔dfnvlowv
从v出发无法到达u以及u的祖先非树边不可能是割边重边不可能是割边 J-Defend Your Country
Zechariah_2001题解 Alkaid~题解
下面结论详细证明可以参考上面两位大佬的题解
结论 对于nnn是偶数的情况显然不需要删边。 对于nnn是奇数的情况最优方案一定是只删除一个点连接的所有边只有这个点的贡献会变负。删去非割点显然只用删一个删掉割点必须保证删除后连通块点数都是偶数。
Code
#includebits/stdc.h
using namespace std;
using lllong long;
template class Tint T rd()
{T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-) fg-1;chgetchar();}while( isdigit(ch)) res(res1)(res3)(ch^48),chgetchar();return res*fg;
}
const int N1000010;
int h[N],e[N2],ne[N2],idx;
void add(int a,int b){e[idx]b,ne[idx]h[a],h[a]idx;}
int n,m,a[N];
ll sum;
int dfn[N],low[N],sz[N],timestamp;
bool cut[N],no[N];
void tarjan(int u,int fa)
{dfn[u]low[u]timestamp;sz[u]1;int chd0;for(int ih[u];i!-1;ine[i]){int ve[i];if(!dfn[v]){tarjan(v,u);sz[u]sz[v];low[u]min(low[u],low[v]);if(low[v]dfn[u]) {if(fa) cut[u]1;// 根节点特判v最多走到u走不到u上面去if(sz[v]1) no[u]1;}if(!fa) chd;// 特判根节点}else if(v!fa) low[u]min(low[u],dfn[v]);}if(chd1) cut[u]1;
}
void init()
{idx0;sum0;timestamp0;for(int i1;in;i) h[i]-1;for(int i1;in;i) dfn[i]low[i]sz[i]0;for(int i1;in;i) no[i]cut[i]0;
}
int main()
{int Tcrd();while(Tc--){nrd(),mrd();init();for(int i1;in;i) a[i]rd(),suma[i];while(m--){int urd(),vrd();add(u,v),add(v,u);}if(n1) {tarjan(1,0);int mn0x3f3f3f3f;for(int i1;in;i)if(!cut[i]||!no[i]) mnmin(mn,a[i]);printf(%lld\n,sum-2*mn);}else printf(%lld\n,sum);}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88188.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!