zoukankan      html  css  js  c++  java
  • P3371最短路

    P3371luogu

    Dijkstra算法

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string> 
    #include<algorithm>
    #include<vector>
    int maxn=2147483647;
    int minn;
    using namespace std;
    struct H{
        int to;//邻接点
        int ll;//边权 
    };
    vector <H> w[10001];//动态数组
    int dis[10001];
    int f[10001];
    int main()
    {
        int n,m,s;
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=m;i++)
        {
            int x,y,l;
            scanf("%d%d%d",&x,&y,&l);
            H k;
            k.to=y;
            k.ll=l;
            w[x].push_back(k);
        }
        f[s]=1;
        for(int i=1;i<=n;i++)dis[i]=maxn;
        for(int i=0;i<w[s].size();i++)
          dis[w[s][i].to]=min(w[s][i].ll,dis[w[s][i].to]);
        dis[s]=0;//!! 到本身为零
        for(int i=1;i<=n-1;i++)
        {
            minn=maxn;
            int k=0;
            for(int j=1;j<=n;j++)
             if(f[j]==0&&dis[j]<minn)//f[j]==0,未添加的点
              minn=dis[j],k=j;
    
            f[k]=1;
            if(k==0)break;
            for(int p=0;p<w[k].size();p++)//w[k].size 个点与k相连
            {
                if(w[k][p].ll+dis[k]<dis[w[k][p].to])//比较
                  dis[w[k][p].to]=w[k][p].ll+dis[k];
            }
        }
        for(int i=1;i<=n;i++)
         printf("%d ",dis[i]);
        return 0;
    }

    spfa算法

    #include<iostream>
    #include<cstdio> 
    #include<cstring>
    #include<queue>
    #include<vector>
    #define LL long long
    #define mm 2147483647
    using namespace std;
    struct H{
        int to;
        int ll;
    };
    vector<H> w[10001];//动态数组,节省空间
    int f[10001];
    int dis[10001];
    
    int team[10*10001];//要大,因为要入很多点
    int main()
    {
        int n,m,s;
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=m;i++)
        {
            int x,y,l;
            scanf("%d%d%d",&x,&y,&l);
            H p;
            p.to=y,p.ll=l;
            w[x].push_back(p);
        }
        for(int i=1;i<=n;i++)dis[i]=mm; 
        dis[s]=0;                                 //初始化
    
        int head=0,tail=1;
    
        team[1]=s,f[s]=1;
        while(tail>head)
        {
            int k=team[++head];
            f[k]=0;//出队
            for(int i=0;i<w[k].size();i++)//只枚举与k相连的点
            {
                if(dis[w[k][i].to]>dis[k]+w[k][i].ll)
                {
                    dis[w[k][i].to]=dis[k]+w[k][i].ll;
                    if(!f[w[k][i].to])//队列中不存在w[k][i].to点
                    {
                        team[++tail]=w[k][i].to;//入队
                        f[team[tail]]=1;
                    }
                }
            }
    
        }
        for(int i=1;i<=n;i++)
         printf("%d ",dis[i]);
        //printf("%d",sizeof(w)/1024/1024);
        return 0;
    }

    Dijkstra好几个小时,
    spfa一个多小时。
    就这样,我被征服了。。。

  • 相关阅读:
    axios取消请求
    echarts常用图表配置
    Vue指令限制输入框输入整数小数
    小程序商品飞入购物车组件
    webpack按测试和生产环境进行编译
    地图画线添加标签
    vue-element-admin 动态侧边栏
    html2canvas 和浏览器打印
    echarts 指定某段曲线颜色
    列出表结构
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819787.html
Copyright © 2011-2022 走看看