生活随笔
收集整理的這篇文章主要介紹了
luogu P4408 [NOI2003]逃学的小孩
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題面?zhèn)魉烷T
顯然最長(zhǎng)的一條是樹(shù)的直徑。
那么找到樹(shù)的直徑后另一條枚舉點(diǎn)然后跑spfaspfaspfa即可。
代碼實(shí)現(xiàn):
#include<cstdio>
#include<queue>
#include<cstring>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std
;
int n
,m
,k
,x
,y
,z
,maxs
,start
,now
,cur
;
long long maxn
,d
[3][200039],ans
,tot
,pus
;
struct yyy
{int to
,w
,z
;}tmp
;
struct ljb
{int head
,h
[200039];yyy f
[400039];inline void add(int x
,int y
,int z
){f
[++head
]=(yyy
){y
,z
,h
[x
]};h
[x
]=head
;}
}s
;
inline void dfs(int x
,int last
,long long d
){if(d
>maxn
){maxn
=d
;maxs
=x
;}int cur
=s
.h
[x
];yyy tmp
;while(cur
!=-1){tmp
=s
.f
[cur
];if(tmp
.to
!=last
) dfs(tmp
.to
,x
,d
+tmp
.w
);cur
=tmp
.z
;}
}
queue
<int > q
;
int main(){memset(s
.h
,-1,sizeof(s
.h
));memset(d
[1],0x3f,sizeof(d
[1]));memset(d
[2],0x3f,sizeof(d
[2]));register int i
;scanf("%d%d",&n
,&m
);for(i
=1;i
<=m
;i
++) scanf("%d%d%d",&x
,&y
,&z
),s
.add(x
,y
,z
),s
.add(y
,x
,z
);dfs(1,1,0);start
=maxs
;maxn
=0;dfs(maxs
,maxs
,0);d
[1][start
]=0;q
.push(start
);while(!q
.empty()){now
=q
.front();q
.pop();cur
=s
.h
[now
];while(cur
!=-1){tmp
=s
.f
[cur
];if(d
[1][tmp
.to
]>d
[1][now
]+tmp
.w
) q
.push(tmp
.to
),d
[1][tmp
.to
]=d
[1][now
]+tmp
.w
;cur
=tmp
.z
;}}d
[2][maxs
]=0;q
.push(maxs
);while(!q
.empty()){now
=q
.front();q
.pop();cur
=s
.h
[now
];while(cur
!=-1){tmp
=s
.f
[cur
];if(d
[2][tmp
.to
]>d
[2][now
]+tmp
.w
) q
.push(tmp
.to
),d
[2][tmp
.to
]=d
[2][now
]+tmp
.w
;cur
=tmp
.z
;}}for(i
=1;i
<=n
;i
++)ans
=max(ans
,min(d
[1][i
],d
[2][i
])+maxn
);printf("%lld\n",ans
);
}
總結(jié)
以上是生活随笔為你收集整理的luogu P4408 [NOI2003]逃学的小孩的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。