洛谷P1546 最短网络 Agri-Net(Prim堆优化)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5005;
 4 const int INF=0x3f3f3f3f;
 5 inline void read(int &tmp)
 6 {
 7     int x=1;char c=getchar();
 8     for(tmp=0;!isdigit(c);c=getchar()) if(c=='-') x=-1;
 9     for(;isdigit(c);tmp=tmp*10+c-48,c=getchar());
10     tmp*=x;
11 }
12 int n,sum,tot,m,mp[maxn][maxn],w[maxn];
13 typedef pair<int,int> P;
14 priority_queue< P,vector<P>,greater<P> >q;
15 bool v[maxn];
16 void Prim()
17 {
18     memset(w,0x3f,sizeof(w));
19     w[1]=0;q.push(make_pair(0,1));
20     while(!q.empty())
21     {
22         int Top=q.top().second;q.pop();
23         if(v[Top]) continue;
24         v[Top]=1;sum+=w[Top];++tot;
25         for(int i=1;i<=n;i++)
26             if(mp[Top][i]<w[i]&&mp[Top][i]>0&&v[i]==false) {w[i]=mp[Top][i];q.push(make_pair(w[i],i));}
27     }
28 } 
29 int main()
30 {
31     read(n);
32     for(int i=1;i<=n;i++)
33         for(int j=1;j<=n;j++)
34                 {read(mp[i][j]);if(i==j) mp[i][j]=INF;}
35     Prim();
36     printf("%d",sum);
37     return 0;
38 }

 

posted @ 2019-01-13 10:41  宇興  阅读(174)  评论(0编辑  收藏  举报