牛客練習試合27 C.水図(dfs+思考)



タイトルリンク:https://www.nowcoder.com/acm/contest/188/C
最小生成木の問題のように見えますが、実際には思考問題+暴捜です.一つのノードからすべてのノードを遍歴しなければならないので、必ず1つのパスを2回歩かなければなりませんが、1つのパスを1回しか歩かないので、私たちは最も長いパスを見つけて彼を1回だけ歩かせるだけです.したがって、最後の結果は、すべてのエッジの重み値の和の2倍から最も長いパスを減算します.
ACコード:
#include 
#define maxn 50005
#define ll long long
using namespace std;
struct Node{
    int to;
    ll w;
    int next;
}Edge[maxn << 1];
int head[maxn << 1];
int n,s,num;
ll maxx;

void init(){
    memset(head,-1,sizeof(head));
    num = 0;
}

void add(int u,int v,ll w){
    Edge[num].to = v;
    Edge[num].w = w;
    Edge[num].next = head[u];
    head[u] = num++;
}

void dfs(int x,int xx,ll step){
    maxx = max(maxx, step);
    for(int i=head[x];i!=-1;i=Edge[i].next){
        if(Edge[i].to == xx)continue;
        dfs(Edge[i].to, x, step + Edge[i].w);
    }
}

int main()
{
    init();
    scanf("%d%d",&n,&s);
    ll sum = 0;
    for(int i=1;i