HDU 2242 强联通分量+树形DP
来源:互联网 发布:速干毛巾 知乎 编辑:程序博客网 时间:2024/05/16 09:33
点击打开链接
题意:中文
思路:题目说切掉一条边使得图分成两部分,也就是割边,那么边双联通模版套入,正好就可以缩点,然后在缩过的图上删除一条边满足题目要求,当然的是若没有割边,就输出impossible就行了,然后树形DP计算出每个点的所有儿子节点的权值即可,计算出最小的值 PS:写的时候以为联通块的编号就是按照块数排下来的,其实不一定,也可能是模版的问题
#include <queue>#include <math.h>#include <vector>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const ll INF=0x3f3f3f3f3f3f3f3fll;const int maxn=10010;vector<int>G[maxn];vector<int>GG[maxn];int L[maxn],E[maxn],vis[maxn],stack1[maxn],val[maxn],sum[maxn],fvis[maxn];int n,m,k,kk,cnt,fsum;void dfs(int x,int fa){ vis[x]=1;L[x]=k;E[x]=k++;stack1[kk++]=x; int flag=0; for(unsigned int i=0;i<G[x].size();i++){ int to=G[x][i]; if(to!=fa){ if(!vis[to]){ dfs(to,x); L[x]=min(L[x],L[to]); }else L[x]=min(L[x],E[to]); }else{ if(flag) L[x]=min(L[x],E[to]); flag++; } } if(L[x]==E[x]){ cnt++; while(stack1[kk]!=x&&kk>0){ L[stack1[kk-1]]=L[x]; kk--; vis[stack1[kk]]=0; } }}void DFS(int x){ fvis[x]=1; for(unsigned int i=0;i<GG[x].size();i++){ int tt=GG[x][i]; if(!fvis[tt]){ DFS(tt); sum[x]+=sum[tt]; } }}int tarjan(){ kk=0;k=1;dfs(1,1); int fcnt=0; for(int i=1;i<=n;i++) sum[L[i]]+=val[i]; for(int i=1;i<=n;i++){ for(unsigned int j=0;j<G[i].size();j++){ int to=G[i][j]; if(L[i]!=L[to]) GG[L[i]].push_back(L[to]),fcnt++; } } if(fcnt==0) return -1; memset(fvis,0,sizeof(fvis)); int ppp=inf; DFS(1); for(int i=1;i<=n;i++){ if(abs(fsum-2*sum[i])<ppp) ppp=abs(fsum-2*sum[i]); } return ppp;}int main(){ int a,b; while(scanf("%d%d",&n,&m)!=-1){ for(int i=0;i<maxn;i++) G[i].clear(),GG[i].clear(); memset(vis,0,sizeof(vis)); memset(sum,0,sizeof(sum)); fsum=0;cnt=0; for(int i=1;i<=n;i++) scanf("%d",&val[i]),fsum+=val[i]; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); a++;b++; G[a].push_back(b); G[b].push_back(a); } int flag=tarjan(); if(flag==-1) printf("impossible\n"); else printf("%d\n",flag); } return 0;}
0 0
- HDU 2242 强联通分量+树形DP
- hdu 2242双联通分量+树形dp
- HDU 3836 强联通分量
- HDU 4635 强联通分量
- HDU 2767 强联通分量
- HDU 3639 强联通分量
- HDU - 2242 考研路茫茫――空调教室(树形DP+强连通分量)
- hdu 2242 (双联通+树形DP)
- HDU 2242 双联通加树形DP
- [BZOJ1179]APIO2009 ATM |强联通分量|DP
- hdu 1269 强联通分量 Tarjan
- hdu 3836 强联通分量分解
- hdu 1827 强联通分量模板
- HDU 4685 强联通分量+网络流
- HDU 1827 3072强联通分量
- 强联通分量
- 强联通分量
- poj2375 强联通分量
- Magic Powder - 2
- FZU 1911Construct a Matrix
- LintCode:旋转图像
- UVA165Stamps
- POJ2007 Scrambled Polygon
- HDU 2242 强联通分量+树形DP
- LeetCode题解-106-Construct Binary Tree from Inorder and Postorder Traversal
- Crossed Ladders(二分+几何)
- hdu5758Explorer Bo
- hdu 3729 I'm Telling the Truth(二分图最大匹配,字典序最大输出)
- 使用OnScrollListener回调处理自动加载更多
- 梯度下降学习率的优化
- OpenCV(C++ 与 Python 的比较)与 MATLAB 的比较
- HDU 5761 Rower Bo