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
原文地址:https://www.cnblogs.com/cdyboke/p/4855407.html