POJ 1985 Cow Marathon(树的直径&BFS+BFS)
2016-04-22 11:04
411 查看
大意:找出图中的相距最远两个点的距离。
思路:由于从任意一个点出发找到最远的一个点,一定在相距最远两点的其中一个端点,所以两次BFS找最远距离。
思路:由于从任意一个点出发找到最远的一个点,一定在相距最远两点的其中一个端点,所以两次BFS找最远距离。
vector: #include<map> #include<queue> #include<cmath> #include<cstdio> #include<stack> #include<iostream> #include<cstring> #include<algorithm> #define ll long long #define inf 0x3f3f3f3f #define eps 1e-8 #include<vector> #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 using namespace std; struct node{ int to,w; }; vector<node>q[100010]; char str[2]; int ans,dis[100010]; bool vis[100010]; int bfs(int u){ memset(dis,0,sizeof(dis)); memset(vis,false,sizeof(vis)); queue<int>Q; while(!Q.empty()) Q.pop(); Q.push(u); vis[u] = true; int bj = u; while(!Q.empty()){ int t = Q.front(); Q.pop(); if(dis[t] > ans){ ans = dis[t]; bj = t; } int len = q[t].size(); for(int i = 0;i < len; ++ i){ node tmp = q[t][i]; if(vis[tmp.to]) continue; vis[tmp.to] = true; dis[tmp.to ] = dis[t] + tmp.w; Q.push(tmp.to); } } return bj; } int main(){ int n,m,i,j,k,a,b,c; while(~scanf("%d%d",&n,&m)){ for(i = 0;i <= n;++ i){ q[i].clear(); } int star; for(i = 0;i < m;++ i){ scanf("%d%d%d%s",&a,&b,&c,str); star = a; q[a].push_back({b,c}); q[b].push_back({a,c}); } ans = 0; int cnt = bfs(star); ans = 0; bfs(cnt); printf("%d\n",ans); } return 0; }
前向星: #include<map> #include<queue> #include<cmath> #include<cstdio> #include<stack> #include<iostream> #include<cstring> #include<algorithm> #define ll long long #define inf 0x3f3f3f3f #define eps 1e-8 #include<vector> #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 using namespace std; struct node{ int to,w,next; }q[100010]; char str[2]; int ans,dis[100010],cnt,head[100010]; bool vis[100010]; void bu(int a,int b,int c){ q[cnt].to = b; q[cnt].w = c; q[cnt].next=head[a]; head[a] = cnt++; q[cnt].to = a; q[cnt].w = c; q[cnt].next=head[b]; head[b] = cnt++; } int bfs(int u){ memset(dis,0,sizeof(dis)); memset(vis,false,sizeof(vis)); queue<int>Q; while(!Q.empty()) Q.pop(); Q.push(u); vis[u] = true; int bj = u; while(!Q.empty()){ int t = Q.front(); Q.pop(); if( dis[t] > ans){ ans = dis[t]; bj = t; } for(int i = head[t] ;~i;i = q[i].next){ int tmp = q[i].to; if(vis[tmp]) continue; vis[tmp] = true; dis[tmp] = dis[t] + q[i].w; Q.push(tmp); } } return bj; } int main(){ int n,m,i,j,k,a,b,c; while(~scanf("%d%d",&n,&m)){ cnt = 0; for(i = 1;i <= n;++ i){ head[i] = -1; } int star; for(i = 0;i < m;++ i){ scanf("%d%d%d%s",&a,&b,&c,str); star = a; bu(a,b,c); } ans = 0; int pp = bfs(star); ans = 0; bfs(pp); printf("%d\n",ans); } return 0; }
相关文章推荐
- Surrounded Regions
- Word Ladder, Gray Code
- UVA 11624
- HDU1495
- HDU2612 Find a way
- HDU1241 Oil Deposits
- Hdu2444二分图
- 最少步数BFS
- 转v_JULY_v的 BFS和DFS优先搜索算法
- 2015 寒假搜索专题 I - Meteor Shower(BFS)
- Same Tree
- E - Roads in the North
- DFS&BFS算法总结(1)
- Word Ladder I
- 图的BFS和DFS学习笔记
- [LeetCode] Binary Tree Level Order Traversal
- [LeetCode] Binary Tree Level Order Traversal II
- 关于BFS搜索的思想, 最简单的水题,不过深有体会啊。
- Word Ladder II
- Surrounded Regions