hdu5438(拓扑排序+dfs)

来源:互联网 发布:microsoft fix it win8 编辑:程序博客网 时间:2024/06/06 01:41

借鉴了两位大佬的博客:
https://www.cnblogs.com/cenariusxz/p/4806748.html
http://blog.csdn.net/ac_gibson/article/details/48437831

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5438

**题意:**p个顶点m条边的无向图,每个顶点有一个权值,现在要删除所有的叶子节点,重复此操作直至形成的“森林”中不存在叶子节点,然后找出森林中顶点个数为奇数的树的权值的和。

思路:模拟拓扑排序,每个点每连一条边,我让它的度数就加2,所有度数为2的点入队,然后把这些点所连的边删掉,即跟它相关联的点的度数减去2,继续把度数为2的点入队列,然后用dfs跑一遍就行了。

代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <queue>#include <vector>using namespace std;const int maxn =10000+5;int T,p,m,s[maxn],deg[maxn],flag[maxn],sum;long long ans,ans1;queue <int> q;vector <int> g[maxn];void dfs(int u){    int l=g[u].size();    sum++;    ans1+=s[u];    flag[u]=1;    for(int i=0; i<l; i++)    {        int v=g[u][i];        if(!flag[v]&&deg[v]>2)            dfs(v);    }    return ;}int main(){    int a,b;    scanf("%d",&T);    while(T--)    {        ans=0;        memset(deg,0,sizeof(deg));        memset(flag,0,sizeof(flag));        while(!q.empty()) q.pop();        scanf("%d%d",&p,&m);        for(int i=1; i<=p; i++)        {            scanf("%d",&s[i]);            g[i].clear();        }        for(int i=0; i<m; i++)        {            scanf("%d%d",&a,&b);            deg[a]+=2;            deg[b]+=2;            g[a].push_back(b);            g[b].push_back(a);        }        for(int i=1; i<=p; i++)        {            if(deg[i]==2)            {                q.push(i);            }        }        while(!q.empty())        {            int u = q.front(),v;            q.pop();            flag[u]=1;            int l=g[u].size();            for(int i = 0; i < l; i++)            {                v=g[u][i];                if(flag[v])                    continue;                deg[v]-=2;                if(deg[v]==2)                    q.push(v);            }        }      for(int i=1; i<=p; i++)      {          if(!flag[i]&&deg[i]>2)          {            sum=0,ans1=0;//sum统计个数 ans1记录和            dfs(i);            if(sum%2==1)                ans+=ans1;          }      }      printf("%lld\n",ans);    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 练瑜伽压腿一字马受伤了怎么办 银行工作人员借钱不还怎么办 借钱不还跑了但有工作怎么办 亲戚家借钱不还怎么办 学习瑜伽教练口令好复杂怎么办 练瑜伽腿的柔韧性不够怎么办 瑜伽扭转时手抓不到脚怎么办 练瑜伽腿部太硬怎么办 褶皱衣服不紧了怎么办 吃撑了肚子涨怎么办 正好压本科线该怎么办 大脚趾被砸了怎么办 脊柱侧弯每天疼怎么办 内衣扣的位置脊柱疼怎么办 练完瑜伽颈椎疼怎么办 乳胶枕头太高了怎么办 枕头太高脖子痛怎么办 颈椎突出症状缓解后怎么办 外痔疼的的历害怎么办 小肚子疼得历害怎么办 练瑜伽伤到颈椎怎么办 鼻子干口干胃烧怎么办 颈椎病压迫神经引起手麻怎么办 4个月婴儿睡觉少怎么办 晚上睡觉睡不好老是醒来怎么办 吃了没熟的香蕉怎么办 70岁父母老吵架怎么办 怀孕七个月晚上睡不着怎么办 九个月宝宝睡眠不好怎么办 一个月的宝宝放不下怎么办 宝宝被吓了发烧怎么办 体内火气重睡不着觉怎么办 宝宝睡觉一直翻身发出声音怎么办 严重失眠怎么办整夜睡不着觉 腿疼得睡不着觉怎么办 19岁晚上睡不着该怎么办 工作累的想哭怎么办 心累迷茫想哭怎么办 白天很累晚上又睡不着怎么办 发型睡觉压乱了怎么办 通宵一夜第二天怎么办