• Dijskstra算法


     

    采用优先队列优化

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    const int maxm=1e6+10;
    int head[maxn],ver[maxm],edge[maxm],nxt[maxm],d[maxn];
    int tot;
    int v[maxn];
    int n,m;
    const int INF=0x3f3f3f3f;
    priority_queue<pair<int,int> > q;
    void add(int x,int y,int z)
    {
        ver[++tot]=y;
        edge[tot]=z;
        nxt[tot]=head[x];
        head[x]=tot;
    }
    void dij()
    {
        memset(d,INF,sizeof(d));
        memset(v,0,sizeof(v));
        d[1]=0;
        q.push(make_pair(0,1));
        while(q.size())
        {
            int x=q.top().second;
            q.pop();
            if(v[x]) continue;
            v[x]=1;
            for(int i=head[x]; i; i=nxt[i])
            {
                int y=ver[i];
                int z=edge[i];
                if(d[y]>d[x]+z)
                {
                    d[y]=d[x]+z;
                    q.push(make_pair(-d[y],y));
                }
            }
        }
    }
    
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)&&n)
        {
            tot=0;
            memset(head,0,sizeof(head));
            for(int i=1; i<=m; i++)
            {
                int x,y,z;
                scanf("%d%d%d",&x,&y,&z);
                add(x,y,z);
                add(y,x,z);
            }
            dij();
            printf("%d
    ",d[n]);
        }
    }
    //6 9
    //1 2 1
    //1 3 12
    //2 3 9
    //2 4 3
    //3 5 5
    //4 3 4
    //4 5 13
    //4 6 15
    //5 6 4
    //
    //0 1 8 4 13 17
    View Code
    #include <cstdio>
    #include <queue>
    #include <vector>
    using namespace std;
    const int maxn = 10000;
    const int INF = 1<<30;
    struct node
    {
        int x,d;
        node() {}
        node(int a,int b)
        {
            x=a;
            d=b;
        }
        bool operator < (const node & a) const
        {
            if(d==a.d) return x<a.x; // 按d从小到大,x从大到小自动排序 
            else return d > a.d;
        }
    };
    vector<node> eg[maxn];
    int dis[maxn],n;
    void Dijkstra(int s)
    {
        int i;
        for(i=0; i<=n; i++) dis[i]=INF;
        dis[s]=0;
        //用优先队列优化,就是个堆
        priority_queue<node> q;
        q.push(node(s,dis[s]));
        while(!q.empty())
        {
            node x=q.top();
            q.pop();
            for(i=0; i<eg[x.x].size(); i++)
            {
                node y=eg[x.x][i];
                if(dis[y.x]>x.d+y.d)
                {
                    dis[y.x]=x.d+y.d;
                    q.push(node(y.x,dis[y.x]));
                }
            }
        }
    }
    int main()
    {
        int a,b,d,m;
        while(scanf("%d%d",&n,&m))
        {
            for(int i=0; i<=n; i++) eg[i].clear();
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&d);
                eg[a].push_back(node(b,d));
                eg[b].push_back(node(a,d));
            }
            Dijkstra(1);
            for(int i=1; i<=n; i++)
                printf("%d ", dis[i]);
        }
        return 0;
    }
    //6 9
    //1 2 1
    //1 3 12
    //2 3 9
    //2 4 3
    //3 5 5
    //4 3 4
    //4 5 13
    //4 6 15
    //5 6 4
    //
    //0 1 8 4 13 17
    View Code

    朴素版本,时间复杂度比上面的要高

    #include<cstdio>
    int e[10][10];
    int dis[10];
    int book[10];
    int main()
    {
        int n, m;
        int inf=99999999;
        scanf("%d%d", &n, &m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(i==j)
                    e[i][j]=0;
                else
                    e[i][j]=inf;
        int t1, t2, t3;
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d", &t1, &t2, &t3);
            e[t1][t2]=t3;
        }
        for(int i=1; i<=n; i++)
        {
            dis[i]=e[1][i];
        }
        int u, min;
        book[1]=1;
        for(int i=1; i<=n; i++)
        {
            min=inf;
            for(int j=1; j<=n; j++)
            {
                if(dis[j]<min && book[j]==0)
                {
                    u=j;
                    min=dis[j];
                }
            }
            book[u]=1;
            for(int v=1; v<=n; v++)
            {
                if(e[u][v]<inf && dis[v]>dis[u]+e[u][v])
                {
                    dis[v]=dis[u]+e[u][v];
                }
            }
        }
        for(int i=1; i<=n; i++)
            printf("%d ", dis[i]);
    }
  • 相关阅读:
    软考解析:2014年上半年下午试题
    软考解析:2014年下半年下午试题
    软考解析:2015年下半年下午试卷
    软考解析:2015年上半年下午试卷
    怎样完善和推广自己的理论模型?
    怎样完善和推广自己的理论模型?
    Android开发——常见的内存泄漏以及解决方案(一)
    聊聊Android5.0中的水波纹效果
    JVM——自定义类加载器
    JVM——Java类加载机制总结
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/9630613.html
Copyright © 2020-2023  润新知