zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",dist[ed].len,dist[ed].cost);
        }
        return 0;
    }
    


  • 相关阅读:
    vue loading 插件编写与实战
    vue tab切换的几种方式
    IOS安卓常见问题
    vue.js 跨域的解决方法(转载)
    vue 根据设计稿rem适配
    vuex 文件夹目录整理
    vue项目优化之路由懒加载
    flutter 环境配置-01
    锚点 定位 导航 滑动
    居中 子元素无固定 宽高
  • 原文地址:https://www.cnblogs.com/pangblog/p/3315602.html
Copyright © 2011-2022 走看看