poj 3268 最短路

题意:求从A点到所有点的最短距离 + 所有点到A点的最短距离 之和的最大值

正反两次dijkstra

 

 

#define M 1001
struct Node{
    int v,val,next;
}edge[2*M*M];

int len;
int head1[M],head2[M],  n,rt;
int dist1[M],dist2[M], pre[M],vis[M];

void add(int &kind,int v,int val){//起点  终点  权值
    edge[len].next=kind;
    edge[len].v=v;
    edge[len].val=val;
    kind=len++;
}

struct nod{
    int u,dist;
};

struct cmp{
    bool operator()(nod e1,nod e2) {
        return e1.dist>e2.dist;//最小堆
    }
};

priority_queue<nod,vector<nod>,cmp> heap;

void Dijkstra(int head[],int dist[]){
    dist[rt]=0; //pre[rt]=-1;
    nod h;
    h.u=rt;  h.dist=0;
    heap.push(h);
    while(!heap.empty()){
        h=heap.top();   heap.pop();
        int u=h.u;  vis[u]=1;
        for(int i = head[u]; i != -1; i = edge[i].next){
            int v = edge[i].v, val = edge[i].val;
            if(vis[v]) continue;
            if(dist[v] > dist[u] + val){
                dist[v] = dist[u] + val;
                //pre[v] = u;
            }
            h.u=v;  h.dist=dist[v];
            heap.push(h);
        }
    }
}

void init(){
    //len = 0;
    memset(head1,-1, sizeof head1); memset(head2,-1, sizeof head2);
    memset(dist1, 1, sizeof dist1); memset(dist2, 1, sizeof dist2);
    memset( vis, 0, sizeof vis );
    //memset( pre, 1, sizeof pre );
    while(!heap.empty()) heap.pop();
}

void build(){
    int m,a,b,c;
    scanf("%d%d%d",&n,&m,&rt);
    while(m--){
        scanf("%d%d%d",&a,&b,&c);
        add(head1[a],b,c);
        add(head2[b],a,c);
    }

}

int main(){
    init();
    build();
    Dijkstra(head1,dist1);    memset(vis,0,sizeof vis); while(!heap.empty()) heap.pop();
    Dijkstra(head2,dist2);

    int ma=0;
    FOE(i,1,n) checkmax(ma,dist1[i]+dist2[i]);
    cout<<ma<<endl;

    return 0;
}

 

 

#define M 1001
struct Node{
    int v,val,next;
}edge[2*M*M];
int len;

int head1[M],head2[M],  n,  rt;
int dist1[M],dist2[M], pre[M], vis[M];

void add(int &kind, int v, int val){//起点  终点  权值
    edge[len].next = kind;
    edge[len].v = v;
    edge[len].val = val;
    kind = len++;
}

queue<int> que;

void SPFA(int head[],int dist[]){
    que.push(rt);  vis[rt]=1;  pre[rt]=-1;  dist[rt]=0;
    while( !que.empty() ){
        int u = que.front(); que.pop(); vis[u] = 0;                                      //cout<<u<<endl;
        for(int i = head[u]; i != -1; i = edge[i].next) {
            int v = edge[i].v,  val = edge[i].val;
            if(dist[v] > dist[u]+val) {
                dist[v] = dist[u]+val; pre[v]=u;
                if( !vis[v] ){
                    vis[v] = 1;   que.push(v);
                }
            }
        }
    }
}

void init(){
    len = 0;
    memset(head1,-1, sizeof head1);     memset(head2,-1, sizeof head2);
    memset(dist1, 1, sizeof dist1);     memset(dist2, 1, sizeof dist2);
    //memset( vis, 0, sizeof vis );
    memset( pre, 1, sizeof pre );
    while(!que.empty()) que.pop();
}

void build(){
    int m, a, b, c;
    scanf("%d%d%d", &n, &m, &rt);
    while( m-- ){
        scanf("%d%d%d", &a, &b, &c);
        add(head1[a], b, c);
        add(head2[b], a, c);
    }
}

int main(){          READ  //
    init();
    build();
    SPFA(head1,dist1);    memset( vis, 0, sizeof vis );while(!que.empty()) que.pop();
    SPFA(head2,dist2);

    int ma=0;
    FOE(i,1,n) checkmax(ma,dist1[i]+dist2[i]);
    printf("%d\n",ma);
    return 0;
}
SPFA

 

posted @ 2013-06-21 13:29  心向往之  阅读(153)  评论(0编辑  收藏  举报