[USACO09OPEN]捉迷藏Hide and Seek
Posted Mrsrz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO09OPEN]捉迷藏Hide and Seek相关的知识,希望对你有一定的参考价值。
题目:洛谷P2951。
题目大意:给你一张无向图,让你找从1出发到其他点的最短路径中,最长的是多少,以及这个点的最小编号,和一共有几个这样的最短路径。
解题思路:跑一遍最短路,然后处理即可。我用的是堆优化Dijkstra。
C++ Code:
#include<cstdio> #include<ext/pb_ds/priority_queue.hpp> #include<vector> #include<cstring> #include<algorithm> using namespace std; struct edge{ int from,to,dist; }; vector<edge>G[80000]; int n,m,d[22222]; struct heapnode{ int u,d; bool operator<(const heapnode&$)const{return d>$.d;} }; __gnu_pbds::priority_queue<heapnode>q; inline void addedge(int from,int to){ G[from].push_back((edge){from,to,1}); G[to].push_back((edge){to,from,1}); } void dijkstra(int s){ memset(d,0x3f,sizeof d); q.push((heapnode){s,d[s]=0}); while(!q.empty()){ heapnode x=q.top(); q.pop(); int u=x.u; if(d[u]!=x.d)continue; for(int i=0;i<G[u].size();++i){ edge& e=G[u][i]; if(d[e.to]>d[u]+e.dist){ d[e.to]=d[u]+e.dist; q.push((heapnode){e.to,d[e.to]}); } } } } int main(){ scanf("%d%d",&n,&m); while(m--){ int x,y; scanf("%d%d",&x,&y); addedge(x,y); } dijkstra(1); int far=*max_element(d+2,d+n+1),cnt=0,num; for(int i=n;i>1;--i) if(d[i]==far){ ++cnt; num=i; } printf("%d %d %d\n",num,far,cnt); return 0; }
以上是关于[USACO09OPEN]捉迷藏Hide and Seek的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏 最短路