zoukankan      html  css  js  c++  java
  • hdu2544 迪杰斯特拉题目优化

    点击打开题目链接

    迪杰斯特拉的用法不多讲,详见  点击打开链接 。

    下面两个代码:


    这个是用邻接矩阵存图的迪杰斯特拉。

    #include<stdio.h>
    int main()
    {
    
        int e[1005][1005],dis[1005],book[1005],i,j,n,m,t1,t2,t3,u,v,min;
        int inf=9999999;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(m==n&&n==0) return 0;
            for(i=1; i<=n; i++)
            {
                for(j=1; j<=n; j++)
                {
                    if(i==j) e[i][j]=0;
                    else e[i][j]=inf;
    
                }
            }
            for(i=1; i<=m; i++)
            {
                scanf("%d%d%d",&t1,&t2,&t3);
                e[t1][t2]=e[t2][t1]=t3;
            }
            for(i=1; i<=n; i++)
            {
                dis[i]=e[1][i];
            }
            for(i=0; i<=n; i++)
            {
                book[i]=0;
            }
            book[1]=1;
    
            for(i=1; i<n; i++)
            {
                min=inf;
                for(j=1; j<=n; j++)
                {
                    if(book[j]==0&&dis[j]<min)
                    {
                        min=dis[j];
                        u=j;
    
                    }
                }
                book[u]=1;
                for(v=1; v<=n; v++)
                {
                    if(e[u][v]<inf)
                        if(dis[v]>dis[u]+e[u][v])
                            dis[v]=dis[u]+e[u][v];
                }
    
            }
            // for(i=1; i<=n; i++)
            printf("%d
    ",dis[n]);
        }
        return 0;
    }

    用数组模拟邻接表的迪杰斯特拉:数组模拟邻接表详见 点击打开链接

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    #define MAX_SIZE 10005
    const int INF=2e9+1e8;
    
    int start[MAX_SIZE],terminal[MAX_SIZE],value[MAX_SIZE];
    int first[MAX_SIZE],nexts[MAX_SIZE],dis[MAX_SIZE],vis[MAX_SIZE];
    int main()
    {
        int n,m,i,j,minn,k;
        while(scanf("%d %d",&n,&m)!=EOF) //  n个点m条边
        {
            if(n==m&&m==0) return 0;
            for(i=1; i<=n; i++)  // 初始化 first 数组
                first[i]=-1;
            for(i=1; i<=m; i++) //  存入m条边
            {
                int ss,ee,vv;
                scanf("%d %d %d",&ss,&ee,&vv);
    
                start[i*2-1]=ss,terminal[i*2-1]=ee,value[i*2-1]=vv;
                nexts[i*2-1]=first[start[i*2-1]];
                first[start[i*2-1]]=i*2-1;
    
                start[i*2]=ee,terminal[i*2]=ss,value[i*2]=vv;
                nexts[i*2]=first[start[i*2]];
                first[start[i*2]]=i*2;
            }
            // 初始化 dis 数组
            k=first[1];
            for(i=1; i<=n; i++)
                dis[i]=INF;
            while(k!=-1)
            {
                dis[terminal[k]]=value[k];
                k=nexts[k];
            }
            memset(vis,0,sizeof(vis)); // 标记当前位置是否来过   0 表示还没有来过
            vis[1]=1;
            int mid_pos;
            int times=n-1;
            // 迪杰斯特拉 核心代码
            while(times--)
            {
                minn=INF;
                for(j=1; j<=n; j++)
                {
                    if(vis[j]==0&&dis[j]<minn)
                    {
                        minn=dis[j];
                        mid_pos=j;
                    }
                }
                if(minn==INF) continue;
                vis[mid_pos]=1;
                //  遍历 pos 点能到的地方
                k=first[mid_pos];
                while(k!=-1)
                {
                    if(dis[mid_pos]+value[k]<dis[terminal[k]]) dis[terminal[k]]=dis[mid_pos]+value[k];
                    k=nexts[k];
                }
            }
    //        for(i=1; i<=n; i++)
    //            printf("%d ",dis[i]);
    //        printf("
    ");
            printf("%d
    ",dis[n]);
        }
        return 0;
    }
    




  • 相关阅读:
    HDU 1505 & POJ 1964 City Game (递推+扫描法)
    web页面内容优化管理与性能技巧
    POJ2406简单KMP
    poj2418map或者字典树
    poj2418map或者字典树
    POJ2296二分2sat
    POJ2296二分2sat
    poj2186强联通(牛仰慕)
    poj2186强联通(牛仰慕)
    poj2175费用流消圈算法
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7207995.html
Copyright © 2011-2022 走看看