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;
}


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