WUST 1944 最短网络Agri-Net(最小生成树之prim算法)

来源:互联网 发布:法棍 知乎 编辑:程序博客网 时间:2024/06/10 15:41

1944: 最短网络Agri-Net

Time Limit: 1 Sec  Memory Limit: 128 MB  64bit IO Format: %lld
Submitted: 22  Accepted: 9
[Submit][Status][Web Board]

Description

  农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000。

Input

多组测试数据。
第一行:农场的个数,N(3<=N<=100)。
后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。N行,每行由N个用空格分隔的数组成。
当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

Output

只有一个输出,其中包含连接到每个农场的光纤的最小长度。

Sample Input 

40 4 9 214 0 8 179 8 0 1621 17 16 0

Sample Output

28

[Submit][Status][Web Board]

题解:

比较水,看到给了邻接矩阵就想到用prim算法,算是prim算法练练手,就是随便找个点作为起始点,然后加入全家桶套餐,vis标记为1,遍历这个点所有另一端没加入全家桶套餐的边,加入优先队列(值小的先出),然后取出另一端没加入套餐且最小值的边,另一个点加入全家桶套餐,然后和刚才一样循环。。知道找完所有的点

代码:

#include<algorithm>#include<iostream>#include<cstring>#include<stdio.h>#include<math.h>#include<string>#include<stdio.h>#include<queue>#include<stack>#include<map>#include<deque>using namespace std;const int INF=100861111;int vis[105];struct edge{    int to;//该边通向的地方    int v;//边的值    friend bool operator<(edge x,edge y)//优先队列重载小于号,值小的点pop    {        return x.v>y.v;    }};priority_queue<edge>q;int p[105][105];int main(){    int i,j,k,n,m,ans,s;    edge now;    while(scanf("%d",&n)!=EOF)    {        s=0;        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                scanf("%d",&p[i][j]);            }            vis[i]=0;//初始化        }        while(!q.empty())q.pop();        int key=0;        ans=1;        vis[0]=1;        while(ans<n)//早足了点就退        {            for(i=0;i<n;i++)            {                if(!vis[i])                {                    now.to=i;                    now.v=p[key][i];                    q.push(now);                }            }            while(!q.empty()&&vis[q.top().to])q.pop();//把已经加入全家桶套餐的边pop掉            now=q.top();            s+=now.v;            ans++;            key=now.to;            vis[key]=1;        }        printf("%d\n",s);    }    return 0;}


原创粉丝点击