想手打个堆优化,搞半天一直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;
}