zoukankan      html  css  js  c++  java
  • Luogu P1546 最短网络 Agri-Net

      其实这道题根本没必要写,但为了测试vector+堆优化的Prim试一发。

      再次觉得Prim和Dijkstra很像,堆优化版本也差不多。

      和Dijkstra一样,Prim也是在之前的dis点中选取一个最短的,但不同是Prim是最短边长,而Dijkstra是到达该点的最短路长度。 

      既然是取最小的,堆自然就派上用场了。

      CODE

    #include<cstdio>
    #include<queue>
    #include<vector>
    #include<cstring>
    using namespace std;
    const int N=105;
    struct data
    {
        int x,num;
        bool operator <(const data a) const
        {
            return a.x<x;
        }
    };
    priority_queue<data> tree;
    vector <int> a[N],l[N];
    int n,dis[N],ans,i,j,x;
    bool f[N];
    inline void read(int &x)
    {
        x=0; char ch=getchar();
        while (ch<'0'||ch>'9') ch=getchar();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    }
    int main()
    {
        memset(dis,63,sizeof(dis));
        read(n);
        for (i=1;i<=n;++i)
        for (j=1;j<=n;++j)
        {
            read(x);
            if (i!=j)
            {
                a[i].push_back(j);
                l[i].push_back(x);
            }
        }
        dis[1]=0;
        tree.push((data){0,1});
        while (!tree.empty())
        {
            int k=tree.top().num; tree.pop();
            if (f[k]) continue;
            f[k]=1; 
            ans+=dis[k];
            for (i=0;i<a[k].size();++i)
            {
                int now=a[k][i];
                if (dis[now]>l[k][i])
                {
                    dis[now]=l[k][i];
                    tree.push((data){dis[now],now});
                }
            }
        }
        printf("%d",ans);
        return 0;
    }
    辣鸡老年选手AFO在即
  • 相关阅读:
    多目标演化算法
    socket编程与线程模型二
    把DataGrid控件定制成漂亮的课程表
    socket编程与线程模型五
    socket编程与线程模型一
    关于RSS的点滴
    对.net事件的看法
    IIs上的证书安装要点
    2d游戏斜视角地图的实现
    Invoke and BeginInvoke
  • 原文地址:https://www.cnblogs.com/cjjsb/p/7930701.html
Copyright © 2011-2022 走看看