POJ 3268 Silver Cow Party(Dijkstra)

来源:互联网 发布:个人简历淘宝客服 编辑:程序博客网 时间:2024/06/05 15:45

POJ 3268 Silver Cow Party(Dijkstra)

http://poj.org/problem?id=3268

题意:

        有N头牛要去参加牛X那里的聚会,现在除了X牛外,其他N-1头牛都要走到X牛那里去.给你M条有向边,现在问你任意一头牛从自己的位置走到X牛那,然后再走回来(来回都选择最短路径走)的话,需要的总时间的最大值是多少?即从所有N-1头牛中找那个最大的来回时间.

分析:


建立两个图,一个输入的有向图,代表从x点到其他所有点的最短距离、

然后建立他的反向图,代表从其他点到x点的距离,因为这里是反向,所以求x到其他点的距离即可。

最后求往返路程和的最大值,即两个图到某个点的和最大。

#include<iostream>#include<cstdio>#include<cstring >#include <cmath>#include<algorithm>#include<queue>using namespace std;const int maxn=1000+10;#define inf 0x3f3f3f3fstruct edge{int from,to, dist;edge(int f,int t,int w):from(f),to(t),dist(w){}};struct heapnode{int d,u;heapnode(int d1,int u1):d(d1),u(u1){}bool operator <(const heapnode&tmp)const{return d>tmp.d;}};struct Dijkstrra{int n,m;vector<edge>edges;vector<int >g[maxn];bool done[maxn];int d[maxn];void init(int n){this->n=n;for(int i=0;i<n;i++)g[i].clear();edges.clear();}void addedge(int from,int to,int dist){edges.push_back(edge(from,to,dist));m=edges.size();g[from].push_back(m-1);}void dijkstra(int s){priority_queue<heapnode>q;for(int i=0;i<n;i++){d[i]=inf;}d[s]=0;memset(done,false,sizeof done);q.push(heapnode(0,s));while(!q.empty()){heapnode x=q.top();q.pop();int u=x.u;if(done[u])continue;done[u]=true;for(int i=0;i<g[u].size();i++){edge &e=edges[g[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to]=d[u]+e.dist;q.push(heapnode(d[e.to],e.to));}}}}}Dj_1,Dj_2;int main(){int n,m,x;scanf("%d%d%d",&n,&m,&x);x--;Dj_1.init(n);Dj_2.init(n);while(m--){int u,v,d;scanf("%d%d%d",&u,&v,&d);u--,v--;Dj_1.addedge(u,v,d);Dj_2.addedge(v,u,d);}Dj_1.dijkstra(x);Dj_2.dijkstra(x);int maxe=-1;for(int i=0;i<n;i++)if(i!=x){maxe=max(maxe,Dj_1.d[i]+Dj_2.d[i]);}printf("%d\n",maxe);return 0;}




原创粉丝点击