Silver Cow Party

Posted a1b3c7d9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Silver Cow Party相关的知识,希望对你有一定的参考价值。

Silver Cow Party

给出一个n个点m条边的有向图,\(w[i][j]\)为i到j的边权,给出一个点X,询问从每个点出发到达X再回到起点的路径长度和最大值,\(n\leq 1000,m\leq 100000\)

显然为单源最短路径的题目,考虑点为起点终点的取反,建反边,工具是bfs(边权为1),双端队列bfs(边权0,1),优先队列bfs(边权为正)。

显然从点X出发得到到达每一个点i的路径长度即该点i返回时路径长度,记做\(dis1[i]\),那么建反边以后,从X到达的点i的路径长度记做\(dis2[i]\)

用优先队列bfs求出这两个数组后,取最大的\(dis1[i]+dis2[i]\)即可。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define Size 1050
#define intmax 1061109567
using namespace std;
template<class free>
struct heap
    free a[Size*Size];int n;
    il void push(free x)
        a[++n]=x;ri int p(n);
        while(p>1)
            if(a[p]<a[p>>1])
                swap(a[p],a[p>>1]),
                    p>>=1;
            else break;
    
    il void pop()
        a[1]=a[n--];ri int p(1),s(2);
        while(s<=n)
            if(s<n&&a[s+1]<a[s])++s;
            if(a[s]<a[p])
                swap(a[s],a[p]),
                    p=s,s<<=1;
            else break;
        
    
;
struct pi
    int x,y;
    il bool operator<(const pi&a)const
        return y<a.y;
    
;
heap<pi>H;
struct point
    point*next;int to,w;
*head[Size],*Head[Size];
int dis1[Size],dis2[Size];
il void read(int&),link(int,int,int,point**),
                     dijistra(int,int*,point**);
int main()
    int n,m,x;
    read(n),read(m),read(x);
    for(int i(1),u,v,w;i<=m;++i)
        read(u),read(v),read(w),
            link(u,v,w,head),
            link(v,u,w,Head);
    memset(dis1,-1,sizeof(dis1)),dijistra(x,dis1,head);
    memset(dis2,-1,sizeof(dis2)),dijistra(x,dis2,Head);
    int ans(-intmax);
    for(int i(1);i<=n;++i)
        ans=max(ans,dis1[i]+dis2[i]);
    printf("%d",ans);
    return 0;

il void dijistra(int s,int *dis,point**head)
    H.n=0,H.push(s,0);pi sour;
    while(H.n)
        sour=H.a[1],H.pop();
        if(dis[sour.x]>=0)continue;
        dis[sour.x]=sour.y;
        for(point*i(head[sour.x]);i!=NULL;i=i->next)
            if(dis[i->to]<0)
                H.push(i->to,i->w+sour.y);
    

il void link(int u,int v,int w,point**head)
    head[u]=new pointhead[u],v,w;

il void read(int &x)
    x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();

以上是关于Silver Cow Party的主要内容,如果未能解决你的问题,请参考以下文章

Silver Cow Party

「POJ 3268」Silver Cow Party

POJ 3268 Silver Cow Party

POJ 3268 Silver Cow Party

poj 3268 Silver Cow Party

POJ 3268 Silver Cow Party(dij+邻接矩阵)