考研路茫茫 (双连通 树形dp)

这道题就是模板的题加上一道很水的树形dp

感觉就先用

1,双连通缩点,如果只存在一个双连通分量,那么肯定是删除任何一个点,这个图还是连通的,

2,利用树形dp把缩点后连成一个图,然后用树形dp的一个dfs就算出答案了

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

#define N 10010
vector <int > mp[N];
vector <int > mp2[N];
stack <int > g;
int id[N];
int val[N];
int number,cnt;
int indexx;
int dfn[N],low[N];
int ans,sum;
int num[N];
int vis[N];
int n,m;

int abs(int x){
    return (x>0)?x:-x;
}
void doubletarjian(int u,int fa){
    int j,v,flag;
    dfn[u]=low[u]=++indexx;
    vis[u]=1;
    g.push(u);
    flag=0;
    for(int i=0;i<mp[u].size();i++){
       v = mp[u][i];
       if(v==fa&&!flag){ flag=1;continue;}
       if(!vis[v]) doubletarjian(v,u);
       low[u]=min(low[u],low[v]);
       }
       if(dfn[u]==low[u]){
            number++;
           while(!g.empty()){
             v = g.top();
             g.pop();
             id[v]=number;
             num[number]+=val[v];
             if(u==v) break;
             }
      }
}

void init(){
     while(!g.empty()){
     g.pop();
     }
     for(int i=0;i<=n;i++){
     mp[i].clear();
     mp2[i].clear();
     }
     memset(dfn,0,sizeof(dfn));
     memset(low,0,sizeof(low));
     number=0;
     indexx=0;
     sum=0;
     memset(val,0,sizeof(val));
     memset(vis,0,sizeof(vis));
     memset(id,0,sizeof(id));
     memset(num,0,sizeof(num));
}

int dfs(int u,int fa){
     //printf("%d->%d   ans==%d\n",fa,u,ans);
     int ret;
     ret=num[u];
     for(int i=0;i<mp2[u].size();i++){
     int v= mp2[u][i];
     if(v==fa) continue;
     ret+=dfs(v,u);
     }
     ans=min(ans,abs(sum-2*ret));
     return ret;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
    init();
    for(int i=0;i<n;i++){
    scanf("%d",&val[i]);
    sum+=val[i];
    }
    for(int i=0;i<m;i++){
    int a,b;
    scanf("%d%d",&a,&b);
    mp[a].push_back(b);
    mp[b].push_back(a);
    }
    doubletarjian(0,0);
   // printf("test...\n");
  //  printf("sum==%d\n",sum);
   // for(int i=1;i<=number;i++)
   // printf("%d->>>%d\n",i,num[i]);
    if(number==1){
    printf("impossible\n");
    continue;
    }
    for(int i=0;i<n;i++)
       for(int j=0;j<mp[i].size();j++){
       if(id[mp[i][j]]!=id[i])
       mp2[id[i]].push_back(id[mp[i][j]]);
       //mp2[id[mp[i][j]]].push_back(id[i]);
       }
    ans=0x7f7f7f7f;
    dfs(1,0);
    printf("%d\n",ans);
    }
}
时间: 2024-08-08 21:55:56

考研路茫茫 (双连通 树形dp)的相关文章

HDU - 2242 考研路茫茫――空调教室(树形DP+强连通分量)

题目大意:众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY. 一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦. Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调.而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部教室都能吹到空调了. 不仅仅这样,学校发现教室人数越来越多,单单一个空调已经不能满足大家的需求.于

hdoj 2242 考研路茫茫——空调教室 【无向图求边双联通 缩点 + 树形dp】

考研路茫茫--空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2447    Accepted Submission(s): 721 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY

HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP

考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY. 一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦. Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调.而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部教室都能吹到空调了. 不仅仅这样,学校发现教

hdu 2242 考研路茫茫――空调教室 (双连通入门题)

1 /********************************************************** 2 题目: 考研路茫茫——空调教室(hdu 2242) 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=2242 4 算法: 双联通 5 思路: 找到桥,然后计算桥两边的差,在把桥一边 6 的值压缩到和另一边相邻的数上. 7 8 *************************************************

HDU 2242 考研路茫茫——空调教室(边双连通)

HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量,然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <vector> using namespace std; const int N = 10005;

HDU 2243 考研路茫茫――单词情结 (AC自动机 + dp)

HDU 2243 考研路茫茫――单词情结 题意:给定一些词根,如果一个单词包含有词根,则认为是有效的.现在问长度不超过L的单词里面,有多少有效的单词? 思路:这道题和POJ 2778是同样的思路.POJ 2778是要找出长度为L的单词里面有多少无效的单词.那么根据同样的方法构造矩阵,然后所有无效的单词个数为 A + A^2 + ... + A^l 个.而所有单词的个数为26 + 26^2 + - + 26^l 个.两个减一下即为答案. 矩阵连乘求和:I + A^2 + A^3 + ... + A

HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)

题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <algorithm> #include <vector> #include &l

HDU 2242 考研路茫茫----空调教室

传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2445    Accepted Submission(s): 720 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无

hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)

考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4843    Accepted Submission(s): 1527 Problem Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了.一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如