wikioi 1167 树网的核 图论

来源:互联网 发布:牧草大数据 编辑:程序博客网 时间:2024/06/06 04:19

本题先用floyd求最短路,顺便将半径长度求出来。

再由此长度确定顶点。然后如果一个点到两端点的距离和等于半径长度,说明这个点再半径上。

然后进num[]再以其到一个端点的距离大小排序。

最后写层循环求解即可。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int n,e,s,ans=1000000,num[500],head,tail;int path[500][500],d[500][500],maxlen,tot,minl,maxl;bool cmp(int x,int y){return d[head][x]<d[head][y] ;}int main(){    scanf("%d%d",&n,&s);    memset(d,63,sizeof(d));    for(int i=1;i<=n;i++)        d[i][i]=0;    for(int i=1;i<n;i++)    {        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        d[x][y]=z;        d[y][x]=z;    }    for(int k=1;k<=n;k++)     for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)          if(d[i][j]>d[i][k]+d[k][j])          {              d[i][j]=d[i][k]+d[k][j];              path[i][j]=path[k][j];              maxlen=max(d[i][j],maxlen);          }for(int i = 1 ; i <= n ; i++){int flag=1 ;for(int j=1;j<=n;j++) if(d[i][j]==maxlen)        {for(int k = 1 ; k <= n ; k++)if(d[i][k] + d[k][j] == maxlen){num[tot++] = k ;}head = i , tail = j ;sort(num , num + tot , cmp) ;flag = 0 ;break ;}if(!flag) break ;}int maxl,minl,ans=1000000;for(int i=0;i<tot;i++)    {for(int j=i;j<tot;j++)if(d[num[i]][num[j]]<=s){maxl=-1 ;for(int k=1;k<=n;k++)            {minl=1000000;for(int p=i;p<=j;p++){minl=min(minl,d[k][num[p]]) ;}maxl = max(maxl,minl) ;}ans = min(maxl,ans) ;}}printf("%d",ans);    return 0;}

0 0
原创粉丝点击