zoukankan      html  css  js  c++  java
  • P1131 [ZJOI2007]时态同步

    #include <bits/stdc++.h>
    #define MAXN 1000005
    using namespace std;
    struct Edge{int next,to,dis;} edge[MAXN];
    int n,s,a,b,t,maxn[MAXN],cnt,head[MAXN];  //maxn储存到子节点的最大边权
    long long ans;  //注意,答案要用long long 存
    
    void addedge(int from, int to, int dis)  
    {
        edge[++cnt].next=head[from];
        edge[cnt].to=to;
        edge[cnt].dis=dis;
        head[from]=cnt;
    }  //前向星加边
    
    void dfs(int x, int fa) //X为当前搜索节点,fa为x的父亲节点
    {
        for(int i=head[x]; i; i=edge[i].next)
            if(edge[i].to!=fa) dfs(edge[i].to, x);
        //这一句一定要最先,先搜索到底层,回溯时再进行后续处理(从下向上维护)
        for(int i=head[x]; i; i=edge[i].next)
            if(edge[i].to!=fa) maxn[x]=max(maxn[x], edge[i].dis);
        //维护到子节点的最大边权
        for(int i=head[x]; i; i=edge[i].next)
            if(edge[i].to!=fa) ans+=(maxn[x]-edge[i].dis);
        //维护答案
        for(int i=head[fa]; i; i=edge[i].next)
            if(edge[i].to==x) edge[i].dis+=maxn[x];
        //这一句不能漏,更新父节点到该节点的边权
    }//注意顺序不能乱
    
    int main()
    {
        scanf("%d%d",&n,&s);
        for(int i=1; i<=n-1; i++)
        {
            scanf("%d%d%d",&a,&b,&t);
            addedge(a, b, t);
            addedge(b, a, t); //是无向图,双向加边
        }
        dfs(s, 0);
        printf("%lld
    ",ans);
        return 0;
    }
    

      

    #include <bits/stdc++.h>#define MAXN 1000005usingnamespacestd; struct Edge{int next,to,dis;} edge[MAXN]; int n,s,a,b,t,maxn[MAXN],cnt,head[MAXN]; //maxn储存到子节点的最大边权longlong ans; //注意,答案要用long long 存void addedge(int from, int to, int dis) { edge[++cnt].next=head[from]; edge[cnt].to=to; edge[cnt].dis=dis; head[from]=cnt; } //前向星加边void dfs(int x, int fa) //X为当前搜索节点,fa为x的父亲节点 { for(int i=head[x]; i; i=edge[i].next) if(edge[i].to!=fa) dfs(edge[i].to, x); //这一句一定要最先,先搜索到底层,回溯时再进行后续处理(从下向上维护)for(int i=head[x]; i; i=edge[i].next) if(edge[i].to!=fa) maxn[x]=max(maxn[x], edge[i].dis); //维护到子节点的最大边权for(int i=head[x]; i; i=edge[i].next) if(edge[i].to!=fa) ans+=(maxn[x]-edge[i].dis); //维护答案for(int i=head[fa]; i; i=edge[i].next) if(edge[i].to==x) edge[i].dis+=maxn[x]; //这一句不能漏,更新父节点到该节点的边权 }//注意顺序不能乱int main() { scanf("%d%d",&n,&s); for(int i=1; i<=n-1; i++) { scanf("%d%d%d",&a,&b,&t); addedge(a, b, t); addedge(b, a, t); //是无向图,双向加边 } dfs(s, 0); printf("%lld ",ans); return0; }

  • 相关阅读:
    Codeforces 362D Fools and Foolproof Roads 构造题
    Machine Learning—Mixtures of Gaussians and the EM algorithm
    Php面向对象 – 单例模式
    标C编程笔记day06 动态分配内存、函数指针、可变长度參数
    html的下拉框的几个基本使用方法
    【创新培育项目】为什么要组队參加比赛?及如何寻找一个合适的选题?
    项目管理心得:一个项目经理的个人体会、经验总结
    GMM的EM算法实现
    oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
    sql server 2005 32位+64位、企业版+标准版、CD+DVD 下载地址大全
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11243511.html
Copyright © 2011-2022 走看看