zoukankan      html  css  js  c++  java
  • UVA 10308 Roads in the North

    input

    u1 v1 w1

    u2 v2 w2

    ...

    un vn wn  1<=vi,ui<=n+1

    /n

    output

    距离最远的两个点的距离

    做法:一颗全连通且只有一条路从一个顶点到达另一个顶点,直接深搜,返回时返回最远的支路,且最远的支路加上第二远的支路和总路途最远比较,更新总路途最大,因为以一个点为中心走很多条路,最远的肯定是最大两条路的和,做法类似dp

      输入有点坑,输完最后一组数据直接EOF,处理输入搞了好久,gets返回的是指针,遇到EOF返回NULL,遇空白行字符串第一个字符为NULL结束符,返回指针不为NULL

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <vector>
     4 #include <algorithm>
     5 #include<cstring>
     6 #define MAX 10010
     7 
     8 using namespace std;
     9 
    10 struct node
    11 {
    12     vector<int>next,dis;
    13 };
    14 
    15 node tree[MAX];
    16 int vis[MAX],maxd;
    17 
    18 int dfs(int x)
    19 {
    20     int max1=0,max2=0;
    21     vector <int>dis;
    22     vector<int>::iterator i,j,k;
    23     for(i=tree[x].next.begin(),j=tree[x].dis.begin();i!=tree[x].next.end();i++,j++)
    24         if(!vis[*i])
    25         {
    26             vis[*i]=1;
    27             dis.push_back(dfs(*i)+*j);
    28         }
    29     if(dis.empty()) return 0;
    30     for(k=i=dis.begin();i!=dis.end();i++)
    31         if(max1<*i) 
    32         {
    33             max1=*i;
    34             k=i;
    35         }
    36     for(j=dis.begin();j!=dis.end();j++)
    37         if(max2<*j&&j!=k) max2=*j;
    38     maxd=max(maxd,max1+max2);//最远的和第二远的相加更新最远
    39     //printf("maxd=%d max1=%d max2=%d
    ",maxd,max1,max2);
    40     return max1;//返回最远的
    41 }
    42 
    43 void init()
    44 {
    45     memset(vis,0,sizeof(vis));
    46     for(int i=0;i<MAX;i++)
    47     {
    48         tree[i].next.clear();
    49         tree[i].dis.clear();
    50     }
    51     maxd=-1;
    52 }
    53 int main()
    54 {
    55     //freopen("/home/user/桌面/in","r",stdin);
    56     int a,b,c;
    57     char s[100];
    58     init();
    59     while(1)
    60     {
    61         char*p=gets(s);
    62         //printf("p=%p
    ",p);
    63         if(s[0]&&p)
    64         {
    65             //printf("s[0]=%d
    ",s[0]);
    66             //printf("1s[0]=%d
    ",s[0]);
    67             sscanf(s,"%d%d%d",&a,&b,&c);
    68             tree[a].next.push_back(b);
    69             tree[a].dis.push_back(c);
    70             tree[b].next.push_back(a);
    71             tree[b].dis.push_back(c);
    72         }
    73         else
    74         {
    75             /*printf("cal:s[0]=%d
    maxd=%d
    vis[1]=%d
    ",s[0],maxd,vis[1]);
    76             for(int i=1;i<=6;i++)
    77                 for(int j=0;tree[i].next.begin()+j!=tree[i].next.end();j++)
    78                     printf("%d:%d %d
    ",i,tree[i].next[j],tree[i].dis[j]);*/
    79             //printf("s[0]=%d
    ",s[0]);
    80             vis[1]=1;
    81             maxd=max(maxd,dfs(1));
    82             printf("%d
    ",maxd);
    83             init();
    84             if(p==NULL) break;
    85         }
    86     }
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    小技巧
    常用的交互设计软件
    Android studio 使用SVN需要忽略的文件
    android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
    git 和 github 关系?
    Double 数据保留两位小数一:五舍六入
    设计模式
    Java中关于日期类那些方法
    ios 开源免费接口
    华为招聘机试整理5:简单四则运算
  • 原文地址:https://www.cnblogs.com/cdyboke/p/4855407.html
Copyright © 2011-2022 走看看