比赛 不平凡的世界 评测结果 C
题目名称 不平凡的引线 最终得分 0
用户昵称 YXH_YXH 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2015-11-05 11:32:37
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int MAXN=100010,oo=2000000;
int N;//边数
struct edge{
	int y,v,next;
}e[MAXN];
int link[MAXN],len;
int du[MAXN];//节点度
int point[MAXN];//节点 距离
int que[MAXN],ceng[MAXN];
bool f[MAXN]={};//队列
double Max=-1.0*oo;
int x,y,v;//temp
inline void insert(int x,int y,int v){
	e[++len].next=link[x],link[x]=len;
	e[len].y=y,e[len].v=v;
}
void init(){
	cin>>N;
	for(int i=1; i<=N; i++){
		scanf("%d%d%d",&x,&y,&v);
		insert(x,y,v),insert(y,x,v);
		du[x]++,du[y]++;
	}
}
void dis(int st){
	memset(f,0,sizeof(f));
	int head=0,tail=0;
	point[st]=0,ceng[st]=0;
	que[++tail]=st,f[st]=1;
	while(++head<=tail){
		for(int i=link[que[head] ]; i; i=e[i].next){
			if(!f[e[i].y ]){//最短路??
				que[++tail]=e[i].y,f[e[i].y ]=1;//进队
				ceng[e[i].y ]=ceng[que[head] ]+e[i].v;//计算dis
				point[e[i].y ]=min(point[e[i].y ],ceng[e[i].y ]);//选择
			}
		}
	}
}
void yu(){
	memset(point,10,sizeof(point));
	for(int i=1; i<=N+1; i++)	if(du[i]==1)	dis(i);
	//for(int i=1; i<=N+1; i++)cout<<point[i]<<endl;
}
void work(){
	memset(f,0,sizeof(f));
	int head=0,tail=0;
	point[1]=0,ceng[1]=0;
	que[++tail]=1,f[1]=1;
	while(++head<=tail){
		for(int i=link[que[head] ]; i; i=e[i].next){
			int temp=abs(point[que[head] ]-point[e[i].y ]);//
			if(temp<e[i].v ){
				double dis=(point[que[head] ]+point[e[i].y ]+e[i].v)*1.0/2;
				if(dis>Max)Max=dis;
			}
			temp=max(point[que[head] ],point[e[i].y ]);
			if(temp>Max)Max=1.0*temp;
		}
	}
}
int main(){
	freopen("firelead.in","r",stdin);
	freopen("firelead.out","w",stdout);
	
	init();
	yu();
	work();
	cout<<Max<<endl;
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
/*

*/