我只是做个记录,而且本人代码水平不怎么样,建议各位看官选择不看。。。。
题目没给出城市的数量,一开始用二维数组存的,最后一组测试数据RE了(据说有一万多数据)。改成vector就好多了
#include<iostream>
#include<cstring>
#include<vector>
#include<iterator>
using namespace std;
vector<int> g[10001],e[10001];
int N,DIS=0,dian=1;
int vis[10001];
void dfs(int s,int d) {
dian=d>DIS?s:dian; // 一遍dfs后找到的最远的点
DIS=d>DIS?d:DIS; // dfs后找到的最远的距离
for(int i=0; i<g[s].size(); i++) {
if(!vis[g[s][i]]) {
vis[g[s][i]]=1;
dfs(g[s][i],d+e[s][i]);
vis[g[s][i]]=0;
}
}
}
int main() {
int x,y,w,cyl;
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
cin>>N;
cyl=N;
while(--cyl) {
cin>>x>>y>>w;
g[x].push_back(y);
e[x].push_back(w);
g[y].push_back(x);
e[y].push_back(w);
}
vis[1]=1;
dfs(1,0);
memset(vis,0,sizeof(vis));
vis[dian]=1;
DIS=0;
dfs(dian,0);
cout<<DIS*(21+DIS)/2<<endl;
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
static int N;
static int dian=0;
static int DIS=0;
static boolean vis[]=new boolean[10001];
static Node[] g;
static void dfs(int s,int d){
dian=d>DIS?s:dian; // 一遍dfs后找到的最远的点
DIS=d>DIS?d:DIS; // dfs后找到的最远的距离
for(int i=0; i<g[s].next.size(); i++) {
int index=g[s].next.get(i);
if(!vis[index]) {
vis[index]=true;
dfs(index,d+g[s].d.get(i));
vis[index]=false;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x,y,w,cyl;
N=sc.nextInt();
g=new Node[N+1];
for(int i=0;i<g.length;i++) {
g[i]=new Node();
}
cyl=N;
while((--cyl)!=0){
x=sc.nextInt();
y=sc.nextInt();
w=sc.nextInt();
g[x].next.add(y);
g[x].d.add(w);
g[y].next.add(x);
g[y].d.add(w);
}
Arrays.fill(vis, false);
vis[1]=true;
dfs(1,0);
Arrays.fill(vis, false);
vis[dian]=true;
DIS=0;
dfs(dian,0);
System.out.println(DIS*(21+DIS)/2);
sc.close();
}
}
class Node{
List<Integer> next=new ArrayList<Integer>();
List<Integer> d=new ArrayList<Integer>();
}