博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO 2004 February - Cow Marathon(bfs求树的直径)
阅读量:5121 次
发布时间:2019-06-13

本文共 1415 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

  有N个农田以及M条路,给出M条路的长度以及路的方向(对树的建立没有影响,最终还是一棵树),让你找到一条 两农田(任意的)间的路径,使得距离最长,并输出最长距离。

题解:

  就是求树的直径

  1. 先以任意点为起始点,bfs找到最远的s

  2. 以s为起点,bfs找到最远的t,求得的s-t即为树的最大直径

#include
#include
#include
#include
#include
#define numm ch-48#define pd putchar(' ')#define pn putchar('\n')#define pb push_back#define fi first#define se second#define fre1 freopen("1.txt","r",stdin)#define fre2 freopen("2.txt","w",stdout)using namespace std;template
void read(T &res) { bool flag=false;char ch; while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true); for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm); flag&&(res=-res);}template
void write(T x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}const int maxn=40010;const int N=1010;//const int M=10010;const int inf=0x3f3f3f3f;typedef long long ll;struct edge { int to,net,w;}e[maxn<<1];int dis[maxn],cnt=0,head[maxn];int pos,ans,n;bool vis[maxn];void add(int u,int v,int w) { e[++cnt].to=v; e[cnt].w=w; e[cnt].net=head[u]; head[u]=cnt;}void bfs(int u) { fill(dis+1,dis+1+n,0); fill(vis+1,vis+1+n,false); vis[u]=true; queue
que; que.push(u); while(!que.empty()) { int k=que.front(); que.pop(); for(int i=head[k];i;i=e[i].net) { int to=e[i].to; if(!vis[to]) { if(dis[to]

  

转载于:https://www.cnblogs.com/wuliking/p/11194110.html

你可能感兴趣的文章
keras_7_评估标准 Metrics
查看>>
logging模块
查看>>
MATLAB图像处理函数汇总(一)
查看>>
linux 安装apache
查看>>
JavaMail
查看>>
如何为你的响应式设计提速
查看>>
PPT是天使还是魔鬼?
查看>>
STM32f0芯片ADC连续读取值相同
查看>>
React Native的ListView的布局使用
查看>>
LINQ Distinct()
查看>>
quartz多个scheduler实现
查看>>
盒子之间的关系
查看>>
NOIP2015&2016普及组解题报告
查看>>
过度拟合的问题
查看>>
jar包导入导出
查看>>
C/C++内存泄漏及检测
查看>>
转HTMLTestRunner 生成测试报告
查看>>
hdu_2925_Musical Chairs_201311121643
查看>>
14_输出映射2_resultMap
查看>>
test11
查看>>