POJ 3140

本文详细介绍了基于图的遍历算法实现过程,包括深度优先搜索(DFS)算法的具体实现细节,如通过递归进行节点距离求和及最小绝对值差计算等。此外,还展示了如何利用邻接表来构建图的数据结构,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #define MAXN 1000010
    #define LL long long
    const LL INF = 0x7fffffffffffff;
    using namespace std;
    typedef struct{
        int to,next;
    }Node;
    Node edge[2*MAXN];
    int vis[MAXN/10],head[MAXN/10],val[MAXN/10];
    LL sum[MAXN/10],all_sum,ans;
    LL My_abs(LL tmp){return tmp < 0 ? -tmp : tmp;}
    void addedge(int u,int v,int k){
        edge[k].to = v;
        edge[k].next = head[u];
        head[u] = k;
    }
    LL dfs_sum(int s){
        vis[s] = 1;
        sum[s] = val[s];
        for(int i = head[s];~i;i = edge[i].next){
            int u = edge[i].to;
            if(!vis[u]) sum[s] += dfs_sum(u);
        }
        return sum[s];
    }
    void dfs_minabs(int s){
        vis[s]= 1;
        for(int i  = head[s];~i;i = edge[i].next){
            int u = edge[i].to;
            if(!vis[u]){
                dfs_minabs(u);
                ans = min(ans,My_abs(all_sum - 2*sum[u]));
            }
        }
    }
    int main(){
        int n,m,cas = 0;
        freopen("in.c","r",stdin);
        while(~scanf("%d%d",&n,&m) && (m+n) ){
            int k = 1,tmp,u,v;
            all_sum = 0;
            for(int i = 1;i <= n;i ++) scanf("%d",&tmp),val[i] = tmp,all_sum += tmp;
            memset(head,-1,sizeof(head));
            for(int i = 0;i < m;i ++){
                scanf("%d%d",&u,&v);
                addedge(u,v,k++);
                addedge(v,u,k++);
            }
            memset(vis,0,sizeof(vis));
            dfs_sum(1);
            ans = INF;
            memset(vis,0,sizeof(vis));
            dfs_minabs(1);
            if(n == 1) ans = val[1];
            printf("Case %d: %lld\n",++cas,ans);
        }
        return 0;
    }

转载于:https://www.cnblogs.com/wangzhili/p/3950265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值