zoukankan      html  css  js  c++  java
  • dijkstra堆优化模板

    #include<bits/stdc++.h>
    using namespace std;
    int xx,yy,vv,dis[510],len=0,lin[510],T,n,m;
    bool vis[510];
    struct one
    {
        int y,v,next;
    };
    one e[20100];
    //priority_queue < pair < int , int > , vector<int> , greater<int> > q;
    priority_queue < pair < int , int > > q;
    void insert()
    {
        e[++len].y=yy;e[len].v=vv;
        e[len].next=lin[xx];lin[xx]=len;
    }
    int main()
    {
        //freopen("xf.in","r",stdin);
        //freopen("xf.out","w",stdout);
        scanf("%d%d%d",&T,&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&xx,&yy,&vv);
            insert();swap(xx,yy);insert();
        }
        memset(vis,false,sizeof(vis));
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        q.push(make_pair(0,1));
        while(q.size())
        {
            int x=q.top().second;q.pop();
            if(vis[x])continue; 
            vis[x]=true;
            for(int i=lin[x];i;i=e[i].next)
            {
                if(dis[e[i].y]>dis[x]+e[i].v)
                {
                    dis[e[i].y]=dis[x]+e[i].v;
                    q.push(make_pair(-dis[e[i].y],e[i].y));
                }
            }
        }
        int sum=0;
        for(int i=1;i<=n;i++)printf("%d
    ",dis[i]);
        return 0;
    }
    /*#include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<iomanip>
    #include<cmath>
    using namespace std;
    int t,f,p,x[510][510],dis[11000],vis[11000],sum=0;
    void dijkstra(int st)
    {
        for(int i=1;i<=f;i++) dis[i]=x[st][i];
        memset(vis,0,sizeof(vis));
        vis[st]=1;dis[st]=0;
        for(int i=2;i<=f;i++)
        {
            int minn=999999999;
            int k=0;
            for(int j=1;j<=f;j++)
                if(vis[j]==0&&dis[j]<minn)
                {
                    minn=dis[j];
                    k=j;
                }
                if(k==0) return;
                vis[k]=1;
                for(int j=1;j<=f;j++)
                {
                    if(vis[j]==0&&dis[k]+x[k][j]<dis[j])
                    {
                        dis[j]=dis[k]+x[k][j];
                    }
                }
        }
        
    }
    int main()
    {
        memset(dis,9,sizeof(dis));
        memset(x,9,sizeof(x));
        scanf("%d%d%d",&t,&f,&p);
        for(int i=1;i<=p;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            if(x[a][b]>c)
            {
            x[a][b]=c;
            x[b][a]=c;
            }
        }
        dijkstra(1);
        for(int i=1;i<=f;i++)
            if(dis[i]<=t) sum++;
        cout<<sum<<endl;
        return 0;
    }*/ 
  • 相关阅读:
    XGBoost参数
    算法
    Python2 和Python3 的区别
    解决ubuntu上ifconfig没有eth0/ens33且无法上网的问题
    Ubuntu 忘记root user密码 关闭图形界面
    rabbitmq消息队列
    CMDB 数据加密 最终整合API验证+AES数据加密
    CMDB API验证
    使用Python生成ASCII字符画
    google 技巧
  • 原文地址:https://www.cnblogs.com/mybing/p/13596340.html
Copyright © 2011-2022 走看看