最小生成树prim代码输出有问题
  • 板块学术版
  • 楼主jyulong
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/15 10:59
  • 上次更新2024/8/15 14:24:06
查看原帖
最小生成树prim代码输出有问题
1351616
jyulong楼主2024/8/15 10:59

输入输出格式 输入格式:   第一行一个数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;
}
2024/8/15 10:59
加载中...