POJ 1985 Cow Marathon 树的直径
2014-02-15 23:24
176 查看
链接:http://poj.org/problem?id=1985
题意:题目阐述不是很清楚,是一棵严格树,不存在环,求其中两点间距离最长一处。
思路:两点间距离最长即为树的直径。易得,从任意点开始DFS找到距离最长一点一定是距离最长两点之一,再从找到的点再DFS一次就可以找到数的直径。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 50005
#define maxm 100005
#define INF 1<<25
#define MAX 0x7fffffff
typedef long long ll;
using namespace std;
struct Edge
{
int v,w;
int next;
}edge[maxm];
int tot,tt;
int point[maxn];
int vv[maxn],dis[maxn];
int top=1,d;
int init()
{
top=1;
memset(edge,0,sizeof(edge));
memset(point,0,sizeof(point));
memset(vv,0,sizeof(vv));
memset(dis,0,sizeof(dis));
d=0;
}
int add_edge(int u,int v,int w)
{
edge[top].v=v;
edge[top].w=w;
edge[top].next=point[u];
point[u]=top++;
edge[top].v=u;
edge[top].w=w;
edge[top].next=point[v];
point[v]=top++;
return 0;
}
int dfs(int x)
{
vv[x]=1;
for(int i=point[x];i!=0;i=edge[i].next)
{
if(!vv[edge[i].v])
{
d+=edge[i].w;
dis[edge[i].v]=d;
dfs(edge[i].v);
d-=edge[i].w;
}
}
}
int main()
{
scanf("%d%d",&tot,&tt);
init();
for(int i=0;i<tt;i++)
{
int x,y,z;
char ss[3];
scanf("%d%d%d%s",&x,&y,&z,ss);
add_edge(x,y,z);
}
dfs(1);
int aa=0,bb;
for(int i=1;i<=tot;i++)
{
if(dis[i]>aa)
{
bb=i;
aa=dis[i];
}
}
memset(dis,0,sizeof(dis));
memset(vv,0,sizeof(vv));
dfs(bb);
aa=0;
d=0;
for(int i=1;i<=tot;i++)
{
if(dis[i]>aa)
{
bb=i;
aa=dis[i];
}
}
printf("%d\n",aa);
}
题意:题目阐述不是很清楚,是一棵严格树,不存在环,求其中两点间距离最长一处。
思路:两点间距离最长即为树的直径。易得,从任意点开始DFS找到距离最长一点一定是距离最长两点之一,再从找到的点再DFS一次就可以找到数的直径。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 50005
#define maxm 100005
#define INF 1<<25
#define MAX 0x7fffffff
typedef long long ll;
using namespace std;
struct Edge
{
int v,w;
int next;
}edge[maxm];
int tot,tt;
int point[maxn];
int vv[maxn],dis[maxn];
int top=1,d;
int init()
{
top=1;
memset(edge,0,sizeof(edge));
memset(point,0,sizeof(point));
memset(vv,0,sizeof(vv));
memset(dis,0,sizeof(dis));
d=0;
}
int add_edge(int u,int v,int w)
{
edge[top].v=v;
edge[top].w=w;
edge[top].next=point[u];
point[u]=top++;
edge[top].v=u;
edge[top].w=w;
edge[top].next=point[v];
point[v]=top++;
return 0;
}
int dfs(int x)
{
vv[x]=1;
for(int i=point[x];i!=0;i=edge[i].next)
{
if(!vv[edge[i].v])
{
d+=edge[i].w;
dis[edge[i].v]=d;
dfs(edge[i].v);
d-=edge[i].w;
}
}
}
int main()
{
scanf("%d%d",&tot,&tt);
init();
for(int i=0;i<tt;i++)
{
int x,y,z;
char ss[3];
scanf("%d%d%d%s",&x,&y,&z,ss);
add_edge(x,y,z);
}
dfs(1);
int aa=0,bb;
for(int i=1;i<=tot;i++)
{
if(dis[i]>aa)
{
bb=i;
aa=dis[i];
}
}
memset(dis,0,sizeof(dis));
memset(vv,0,sizeof(vv));
dfs(bb);
aa=0;
d=0;
for(int i=1;i<=tot;i++)
{
if(dis[i]>aa)
{
bb=i;
aa=dis[i];
}
}
printf("%d\n",aa);
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- 封装好的Folyd建图,C++源码
- ZOJ Problem Set - 1711 解题报告
- ZOJ Problem Set - 2412解题报告
- ZOJ Problem Set - 1457 解题报告
- POJ1979 Red and Black 题解
- poj 3249 Test for Job 最长路
- HDU 2544
- Timus 1557 Network Attack DFS+各种各种...
- HDU1289 Tarjan-模板题
- Dijkstra算法