输入输出格式 输入格式: 第一行一个数n,表示无向图的顶点的数量(n<=1000),接下来从第2行到第n+1行,每行有n个数(0表示相应点之间无边直接相连,不为0表示相应点之间有边直接相连,其值即为相连边的权值),形成一个n*n的矩阵,用以表示这个无向图。
输出格式: 一行,仅一个数,表示最小生成树的边权值和。
输入样例#1:
8
0 9 4 6 0 0 0 0
9 0 0 2 0 0 0 0
4 0 0 1 9 0 0 0
6 2 1 0 0 2 6 0
0 0 9 0 0 3 0 0
0 0 0 2 3 0 0 7
0 0 0 6 0 0 0 2
0 0 0 0 0 7 2 0
输出样例#1:
20
我的代码输出比正确输出少了1,请问哪里有问题
#include<bits/stdc++.h>
using namespace std;
struct edge
{
int to;
int weight;
};
vector<edge> head[1001];
bool operator<(const edge &a,const edge &b)
{
return a.weight>b.weight;
}
priority_queue<edge> q;
bool vis[1000];
int main()
{
int i,j,k,u,v,n,ans=0;
edge e;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>k;
if(k>0)
{
head[i].push_back({j,k});
}
}
}
vis[1]=1;
for(i=0;i<head[1].size();i++)
{
q.push(head[1][i]);
}
for(i=1;i<n;i++)
{
while(!q.empty())
{
e=q.top();
q.pop();
if(!vis[e.to])
{
ans+=e.weight;
vis[e.to]=1;
break;
}
}
}
u=e.to;
for(j=0;j<head[u].size();j++)
{
if(!vis[head[u][j].to])
{
q.push(head[u][j]);
}
}
cout<<ans;
return 0;
}