10308

This is the problem to find the tree diameter.

#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <vector>
#include <string>
#include <queue>
#include <string.h>
#include <stdio.h>

#define ull unsigned long long
#define SZ 10002
#define FOR(i,a) for(int i=0;i<a;i++)

using namespace std;

vector<int> graph[SZ];
bool visit[SZ];
int distnce[SZ][SZ];
ull distnode[SZ];
ull max_dist=0;
int farthestnode;

void bfs(int u)
{
	int tmp;
	memset(visit,0,sizeof(visit));
	int next_node;
	max_dist=0;
	queue<int> q;
	q.push(u);
	distnode[u]=0;
	while(!q.empty())
	{
		tmp = q.front();
		q.pop();
		visit[tmp]=1;

		if(distnode[tmp]>max_dist)
		{
			max_dist=distnode[tmp];
			farthestnode = tmp;
		}
		for(int i=0;i<graph[tmp].size();i++)
		{
			next_node = graph[tmp][i];
			if(!visit[next_node])
			{
				distnode[next_node]=distnode[tmp]+distnce[tmp][next_node];
				q.push(next_node);
			}
		}

	}

}


int main()
{
	string s,s1;
	int from,dest,cost;
	stringstream ss;

	while(!cin.eof())
	{
		getline(cin,s);

		if(s=="")
		{
			cout<<0<<"\n";
			continue;
		}

		FOR(i,SZ)
		graph[i].clear();

		memset(distnce,0,sizeof(distnce));
		memset(distnode,0,sizeof(distnode));

		while(!cin.eof() && s.size()>0)
		{
			if(s=="")
			break;
			ss.clear();
			ss<<s;
			ss>>from>>dest>>cost;

			graph[from].push_back(dest);
			graph[dest].push_back(from);

			distnce[from][dest]=cost;
			distnce[dest][from]=cost;

			getline(cin,s);
		}

		bfs(1);
		bfs(farthestnode);

		cout<<max_dist<<"\n";

	}

	return 0;

}

 

Leave a Reply

Your email address will not be published. Required fields are marked *