zoukankan      html  css  js  c++  java
  • hdu3790 最短路径问题 dijstra算法

    直接套用dijstra算法,记得更新花费。
    这题被坑了,同一条路居然有不同的距离和花费,所以赋值map的时候就要注意了,记得更新呀。。。
    #include<stdio.h>
    #include<string.h>
    #define INF 200000000
    int map[1001][1001],mapc[1001][1001],visit[1001],dist[1001],cost[1001],n;
    int dijstra(int s,int t)
    {
        int i,j,k,min,min1,v;
        memset(visit,0,sizeof(visit));
        for(i=1;i<=n;i++)
        {
            dist[i]=map[s][i];
            cost[i]=mapc[s][i];
        }
        dist[s]=0;
        cost[s]=0;
        visit[s]=1;
        for(i=1;i<=n;i++)
        {
            for(j=1,min=INF,v=s;j<=n;j++)
            {
                if(dist[j]<min&&visit[j]!=1)
                {
                    min=dist[j];
                    v=j;
                }
            }
            for(j=1;j<=n;j++)
            {
                if(dist[v]+map[v][j]<dist[j])
                {
                    dist[j]=dist[v]+map[v][j];
                    cost[j]=cost[v]+mapc[v][j];
                }
                else if(dist[v]+map[v][j]==dist[j])
                {
                    if(cost[v]+mapc[v][j]<cost[j])
                    {
                        cost[j]=cost[v]+mapc[v][j];
                    }
                }
            }
            visit[v]=1;
        }
        printf("%d %d
    ",dist[t],cost[t]);
    }
    int main()
    {
        int m,a,b,d,p,i,j,k,s,t;
        while(scanf("%d%d",&n,&m)!=EOF&&(n!=0||m!=0))
        {
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                {
                    map[i][j]=INF;
                    mapc[i][j]=INF;
                }
            for(i=1;i<=m;i++)
            {
                scanf("%d%d%d%d",&a,&b,&d,&p);
                if(map[a][b]>d)
                {
                    map[a][b]=d;
                    map[b][a]=d;
                    mapc[a][b]=p;
                    mapc[b][a]=p;
                }
                else if(mapc[a][b]==d)
                {
                    if(mapc[a][b]>p)
                    {
                        mapc[a][b]=p;
                        mapc[b][a]=p;
                    }
                }
            }
            scanf("%d%d",&s,&t);
            dijstra(s,t);
        }
        return 0;
    }
     
  • 相关阅读:
    void及void指针含义的深刻解析
    jbpm入门样例
    给字符数组赋值的方法
    linux tar.gz zip 解压缩 压缩命令
    android 文件上传
    职员有薪水了
    sublime配置全攻略
    [置顶] WPF数据修改demo
    Java实现快速排序
    Java实现快速排序
  • 原文地址:https://www.cnblogs.com/qpddk/p/3264058.html
Copyright © 2011-2022 走看看