HDU 3790 最短路径问题 (SPFA)

转载请注明出处:http://blog.csdn.net/a1dark

分析:比一般最短路多了一个花费、多加一个判断即可、用的SPFA、这道题让我搞清楚了以前定义INF为啥爆的问题、受益颇多、

 

#include<stdio.h>

#include<queue>

#include<string.h>

#include<algorithm>

using namespace std;

#define INF 0x7fffffff

#define N 1005

struct node{

    int len,cost;

}map[N][N];

node dist[N];

int vis[N];

int m,n;

void spfa(int x){

    memset(vis,0,sizeof(vis));

    for(int i=1;i<=n;i++){

        dist[i].len=INF;

        dist[i].cost=INF;

    }

    dist[x].len=0;

    dist[x].cost=0;

    queue<int >q;

    q.push(x);

    vis[x]=1;



    while(!q.empty()){

        int now=q.front();

        q.pop();

        vis[now]=0;

        for(int i=1;i<=n;i++){

            if(map[now][i].len+dist[now].len<dist[i].len&&map[now][i].len!=INF){

                dist[i].len=map[now][i].len+dist[now].len;

                printf("%d\n",map[now][i].len);

                dist[i].cost=map[now][i].cost+dist[now].cost;

                if(!vis[i]){

                    q.push(i);

                    vis[i]=1;

                }

            }

            if(map[now][i].len+dist[now].len==dist[i].len&&map[now][i].cost+dist[now].cost<dist[i].cost){

                map[now][i].cost+dist[now].cost==dist[i].cost;

            }

        }

    }

}

void init(){

    for(int i=1;i<=n;i++)

        for(int j=1;j<=n;j++){

            if(i==j){

                map[i][j].len=0;

                map[i][j].cost=0;

            }

            else{

                map[i][j].len=INF;

                map[i][j].cost=INF;

            }

        }

}

int main(){

    while(scanf("%d%d",&n,&m)!=EOF){

        if(n==0&&m==0)break;

        init();

        int s,e,d,p;

        for(int i=1;i<=m;i++){

            scanf("%d%d%d%d",&s,&e,&d,&p);

            if(d<map[s][e].len){

                map[s][e].len=d;

                map[e][s].len=d;

                map[s][e].cost=p;

                map[e][s].cost=p;

            }

            else if(d==map[s][e].len&&p<map[s][e].cost){

                map[s][e].cost=p;

                map[e][s].cost=p;

            }

        }

        int st,ed;

        scanf("%d%d",&st,&ed);

        spfa(st);

        printf("%d %d\n",dist[ed].len,dist[ed].cost);

    }

    return 0;

}


 

 

你可能感兴趣的:(最短路径)