树的直径题目。两次BFS
//9186307 NKHelloWorld 1985 Accepted 1824K 141MS C++ 1490B 2011-08-18 10:56:49 //9186317 NKHelloWorld 1985 Accepted 1824K 110MS C++ 1565B 2011-08-18 10:57:21 //9186348 NKHelloWorld 1985 Accepted 1888K 141MS G++ 1644B 2011-08-18 10:59:14 #include <cstdio> #include <cstring> #define MAXN 81000 int n,m; struct EDGE { int to,dis,next; }edge[MAXN]; int pt_edge = 0,index[41000],endpt = 1,ans = 0; int que[MAXN],dis[MAXN]; bool visited[MAXN]; int bfs(int start) { int j; int tail = 0,head = 0; memset(visited,false,sizeof(visited)); dis[tail] = 0; que[tail++] = start; visited[start] = true; while(head < tail) { for(j=index[que[head]];j!=-1;j=edge[j].next) { if(visited[edge[j].to]==false) { dis[tail] = dis[head] + edge[j].dis; que[tail] = edge[j].to; visited[que[tail]] = true; if(dis[tail] > ans) { ans = dis[tail]; endpt = que[tail]; } tail++; } } head++; } return ans; } int main() { int i,j,f1,f2,dis; char dir[5]; memset(index,-1,sizeof(index)); scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d%s",&f1,&f2,&dis,dir); edge[pt_edge].next = index[f1]; index[f1] = pt_edge; edge[pt_edge].to = f2; edge[pt_edge++].dis = dis; edge[pt_edge].next = index[f2]; index[f2] = pt_edge; edge[pt_edge].to = f1; edge[pt_edge++].dis = dis; } bfs(1); printf("%d\n",bfs(endpt)); return 0; }