poj 3140

来源:互联网 发布:网络上怼是什么意思 编辑:程序博客网 时间:2024/06/11 03:16

艹 坑爹啊,居然是 abs函数的问题,整数的abs 居然有问题。。
题意中的m的范围也是个坑,完全可以忽略。
题意: 把一个树分成两部分,是的他们的差值最小(叶子节点有值)。
类似树形dp,其实就是个dfs,用vector优化,不然会tle的。

#include <cstdio>#include <iostream>#include <cstring>#include <vector>using namespace std;long long abs1(long long x) {    // poj  系统abs跪了,我醉了    if(x < 0) return -x;    return x;}int n,m;bool visit[100010]={};long long dp[100010]={};long long sum;long long ans;vector<int>mp[100010];void dfs(int root) {    visit[root] = 1;    int len = mp[root].size();    for(int i = 0; i < len; i++) {        int y = mp[root][i];        if(visit[y] == 0) {            dfs(y);            dp[root] += dp[y];        }    }    if(abs1(sum - dp[root]*2) < ans)      ans = abs1(sum - dp[root]*2);}int main() {    int ca = 1;    while(scanf("%d %d",&n,&m),n||m) {        memset(visit,0,sizeof(visit));        memset(dp,0,sizeof(dp));        for(int i = 1; i <= n; i++) mp[i].clear();        sum = 0;        for(int i = 1; i <= n; i++) {            scanf("%lld",&dp[i]);            sum += dp[i];        }        int x,y;        ans = sum;        for(int i = 1; i <= m; i++) {            scanf("%d%d",&x,&y);            mp[x].push_back(y);            mp[y].push_back(x);        }        dfs(1);        printf("Case %d: %lld\n",ca++,ans);    }    return 0;}
0 0
原创粉丝点击