• UVA 10308 Roads in the North


    UVA_10308

        由于原图是一棵树,这样我们只要随便指定一个树根就可以画成树的形式,那么所有路径都可以看成以父节点为中转点的“儿子甲+儿子乙”的形式(当然只有一个儿子的处理方式也是一样的),同时我们用dfs遍历树的时候父节点顺便向上返回一个最大的儿子即可。

        我在看UVA的论坛的时候,有人说是存在village数为0的情况,并且这种情况用一个空行表示,因此我们不能把所有的空行都当做分割线去处理,但实际上不考虑这种情况直接交也能AC,可能是后来UVA改了数据吧,不过我的程序还是按考虑有这种情况来写的。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 10010
    #define MAXM 20010
    char b[100];
    int start, e, first[MAXD], next[MAXM], v[MAXM], w[MAXM];
    long long int res;
    void add(int x, int y, int z)
    {
    w[e] = z;
    v[e] = y;
    next[e] = first[x];
    first[x] = e;
    e ++;
    }
    long long int dfs(int u, int fa)
    {
    int i, j;
    long long int max = 0, ans;
    for(i = first[u]; i != -1; i = next[i])
    if(v[i] != fa)
    {
    ans = dfs(v[i], u) + w[i];
    if(ans + max > res)
    res = ans + max;
    if(ans > max)
    max = ans;
    }
    return max;
    }
    void solve()
    {
    int i, j, k;
    res = 0;
    dfs(1, -1);
    printf("%lld\n", res);
    }
    int main()
    {
    int x, y, z, ok = 1, blank = 1;
    while(ok)
    {
    memset(first, -1, sizeof(first));
    e = start = 0;
    for(;;)
    {
    if(gets(b) == NULL)
    {
    ok = 0;
    break;
    }
    if(b[0] == '\0')
    {
    if(blank)
    {
    if(gets(b) == NULL)
    ok = 0;
    }
    blank = 1;
    break;
    }
    else
    blank = 0;
    sscanf(b, "%d%d%d", &x, &y, &z);
    start = x;
    add(x, y, z);
    add(y, x, z);
    }
    solve();
    }
    return 0;
    }


  • 相关阅读:
    Tomcat启动报错java.net.AbstractPlainSocketImpl(java/net/AbstractPlainSocketImpl.java:178:-1)Struts在网络复杂情况下启动报错解决办法
    webpack入门级教程
    jquery-ui sortable 使用实例
    JS-类型转换
    JavaScript语言核心--词法结构
    理解CSS盒子模型
    HTML DOCTYPE 标签
    2015总结和2016计划
    MVC & MVVM
    前端常见问题汇总
  • 原文地址:https://www.cnblogs.com/staginner/p/2285049.html
Copyright © 2020-2023  润新知