• 大臣的旅费


    需要注意的是开数据的问题。本题比较坑,没有给出问题规模。但是估计有一万个顶点,我用的前向星,边表需要V²的大小,但是这样开会爆掉。题设给出边的数目不会超过顶点的数目,这很关键,所以直接开成V×2(因为是无向图要两边连)

    还有就是推公式,这个比较简单,通过样例数据看出是等差数列求和即可。

    但是用dfs会超时,最后一组数据过不了

    dfs代码:

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 10010
    #define MAX 0x06FFFFFF
    #define V vector<int>
    
    using namespace std;
    
    
    struct edge{
        int to,w,next;
    }mp[LEN*2];
    int head[LEN];
    int eID=0;
    void add(int u,int v,int w){
        mp[eID].to=v;
        mp[eID].w=w;
        mp[eID].next=head[u];
        head[u]=eID++;
    }
    
    int vis[LEN];
    
    int maxD=0;
    
    void dfs(int s,int d) {
        maxD=max(maxD,d);
        vis[s]=1;
        int i;
        for(i=head[s];~i;i=mp[i].next){
            int to=mp[i].to;
            if(vis[to]==0){
                dfs(to,d+mp[i].w);
            }
        }
        vis[s]=0;
    }
    
    int main(){
    //    freopen("D:/CbWorkspace/blue_bridge/大臣的旅费.txt","r",stdin);
        int N,i,j,a,b,c;
        I("%d",&N);
        memset(head,-1,sizeof head);
        FF(i,N-1){
            I("%d%d%d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        FF(i,N){    //遍历每个点,求最长距离 
            dfs(i,0);
        }
        O("%d",(21+maxD)*maxD/2);
        return 0;
    }
  • 相关阅读:
    Windows自动更新所需要连接的网站列表
    DFX 9.303 for QQMusic 2010
    在VPC 2007 SP1中安装Ubuntu 10.04 desktop (完成)
    穷人把钱存入银行,实际上是补贴富人。
    清理Windows右下角图标
    阿里镜像pull 加速器
    k8s 安装flannel网络插件
    k8s pull.sh
    kubeadm1.10.00 安装k8s集群
    虚拟机vmware centos7 扩展磁盘空间
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8650355.html
Copyright © 2020-2023  润新知