zoukankan      html  css  js  c++  java
  • hdu 3899 JLUCPC

    题意:在一棵树上,找出一个节点,使得每一个节点到达该点的距离(权值*路径长度)和最短。

    分析:先dfs求出每一个节点到根节点的距离和,然后再一次深搜即可。

    交了之后悲剧的爆栈了,递归太是太深了,所以,开挂了,哈

    View Code
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int N = 100010;
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    //开挂了,嘿嘿
    struct edge
    {
    int v,w;
    edge(){}
    edge(int a,int b):v(a),w(b){}
    };
    vector<edge> g[N];
    int n,tn[N],t[N];
    //t[N]表示每一个节点的权值,tn[]表示子树的权值和
    __int64 dist[N];
    bool vis[N];
    void init()
    {
    for(int i=0;i<=n;i++)
    g[i].clear();
    memset(vis,false,sizeof(vis));
    memset(dist,0,sizeof(dist));
    }
    void dfs(int u,int dis)
    {
    vis[u]=true;
    dist[1]+=1ll*dis*t[u];
    tn[u]=t[u];
    int size=g[u].size();
    for(int i=0;i<size;i++)
    {
    int v=g[u][i].v;
    if(vis[v]) continue;
    dfs(v,dis+g[u][i].w);
    tn[u]+=tn[v];
    }
    }
    void dfs1(int u)
    {
    vis[u]=true;
    int size=g[u].size();
    for(int i=0;i<size;i++)
    {
    int v=g[u][i].v,w=g[u][i].w;
    if(vis[v]) continue;
    dist[v]=dist[u]+1ll*(tn[1]-2*tn[v])*w;
    dfs1(v);
    }
    }
    int main()
    {
    int x,y,w;
    while(scanf("%d",&n)==1)
    {
    init();
    for(int i=1;i<=n;i++)
    scanf("%d",&t[i]);
    for(int i=1;i<n;i++)
    {
    scanf("%d %d %d",&x,&y,&w);
    g[x].push_back(edge(y,w));
    g[y].push_back(edge(x,w));
    }
    dfs(1,0);
    memset(vis,false,sizeof(vis));
    dfs1(1);
    __int64 ans=dist[1];
    for(int i=2;i<=n;i++)
    {
    ans=min(ans,dist[i]);
    }
    printf("%I64d\n",ans);
    }
    return 0;
    }
  • 相关阅读:
    如何手动卸载 SQL Server 2005 实例
    马大哈的读后感
    CVS提交0KB的文件失败
    confluence权限管理
    关于confluence注册
    建议使用j2ee自带的ant
    cvs log的几个选项说明(b,r HEAD,n,d)
    JIRA与Confluence的安装与集成(4)
    使用命令行调用Beyond Compare进行文件对比
    利用SecureCRT实现Linux编译
  • 原文地址:https://www.cnblogs.com/nanke/p/2383788.html
Copyright © 2011-2022 走看看