比赛 |
不平凡的世界 |
评测结果 |
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;
}
/*
*/