poj1985 树的直径
2015-07-20 22:54
459 查看
题意求树的直径,直接贴代码
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; typedef struct { int to,val,next; //定义边的终点以及权值和这条边的下一条边 }Edge; Edge edge[100050]; //开50000会WA int head[50000],e; int dis[50000]; //记录第i个点的最长距离,若没有被访问过,则为-1 void addedge(int from,int to,int w){ edge[e].to = to; edge[e].val = w; edge[e].next = head[from]; head[from] = e++; //保存下一条边的位置,e代表第e条边 } int bfs(int v){ memset(dis,-1,sizeof(dis)); dis[v] = 0; //初始点距离为0 int tem = v; queue<int> q; q.push(v); //队列的入队 while(!q.empty()) //队列判断是否为空 { int f = q.front(); //取队首元素 q.pop(); //队列弹出 for(int i = head[f]; i != -1; i = edge[i].next){ //对第f个点的邻接表遍历,i为第f个点导出的边 int t = edge[i].to; //第f个点能够到达的点 if(dis[t]==-1) //如果没有被访问过 { dis[t] = dis[f] + edge[i].val; //更新距离 if(dis[t] > dis[tem]) tem = t; q.push(t); } } } return tem; } int main(){ int m,n; while(~scanf("%d%d",&n,&m)){ memset(head,-1,sizeof(head)); //邻接表存储图的表头,初始化为-1 e = 0; int a,b,w; char c; for(int i = 0; i < m; i++) { scanf("%d%d%d %c",&a,&b,&w,&c); //char型变量的输入,注意getchar addedge(a,b,w); //无向图加入两次 addedge(b,a,w); } int fa = bfs(1); //第一次bfs求出一个最远的点 int ans = bfs(fa); //第二次bfs从最远的点求另一个最远的点 printf("%d\n",dis[ans]); } }晚上装了win10,调戏了一会cortana,感觉挺好的,等正式版上线ing
相关文章推荐
- stuts2注解
- XMPP系列(二)----用户注册和用户登录功能
- XMPP系列(二)----用户注册和用户登录功能
- post和get提交服务器编码过程
- Uber优步北京第四组奖励政策
- Hive桶列BucketedTables
- Python进阶---一Python小测试
- mysql插入中文时候编码问题
- rosbuild
- C语言小练习
- 【整理】--【字符设备】分配设备号register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
- 启动erlang/OTP里面的Web服务器(application INETS启动过程代码分析)
- ORA-4031错误 解决方法
- Linux脚本备忘
- 一个简单RPC框架是如何炼成的(VI)——引入服务注册机制
- javaEE第三~四天
- 状态模式
- Freemarker学习中遇到的问题
- 张珺 2015/07/15 个人文档
- Maximum Subarray