poj 1258 最小生成树 prim+优先队列

来源:互联网 发布:龙之信条女性捏脸数据 编辑:程序博客网 时间:2024/06/09 22:07


想手打个堆优化,搞半天一直WA,悲剧……

#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>#include <vector>#include <queue>using namespace std;#define M 550000#define N 5500#define INF (1<<30)struct Edge{int v,w; Edge(int _v=0,int _w=0){v=_v;w=_w;}}edge[M];int adj[M],head[N],e,ans,n,vis[N],dist[N];bool operator<(const Edge aa,const  Edge bb){return aa.w>bb.w;}priority_queue<Edge>q;void prim(){ans=0;int v,w,u;Edge t;memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i)dist[i]=INF;for(int i=head[1];i!=-1;i=adj[i])if(edge[i].w<dist[edge[i].v]){dist[edge[i].v]=edge[i].w;q.push(Edge(edge[i].v,edge[i].w));}int cnt=1;vis[1]=1;while(!q.empty()){t=q.top();q.pop();if(vis[t.v]) continue;ans+=t.w;vis[t.v]=1;cnt++;if(cnt>n) break;for(int i=head[t.v];i!=-1;i=adj[i])if(edge[i].w<dist[edge[i].v]&&!vis[edge[i].v]){dist[edge[i].v]=edge[i].w;q.push(Edge(edge[i].v,edge[i].w));}}}void insert(int u,int v,int w){edge[e].v=v;edge[e].w=w;adj[e]=head[u];head[u]=e++;}int main (){while(scanf("%d",&n)!=EOF){e=0;memset(head,-1,sizeof(head));int t;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){scanf("%d",&t);if(j>i){insert(i,j,t);insert(j,i,t);}}prim();printf("%d\n",ans);}system("pause");return 0;}


原创粉丝点击