最小生成树求救!
查看原帖
最小生成树求救!
1050431
DevilsFlame楼主2024/8/6 11:13

对于这个hack数据:

3
1
1
1
0 9 9
9 0 9
9 9 0

输出:(正确)
3
代码:

#include<bits/stdc++.h>++
#define N 5005
#define p push_back
#define mk make_pair
using namespace std;
int n,m,z,f[N];
vector <pair <int,int> > e[N];
priority_queue <pair <int,int> ,vector <pair <int,int> > ,greater <pair <int,int> > > q;
int ans,tot = 1;
bool v[N];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
	cin >> n;
//	int c = 1e10,ch = 0;
	for(int i = 1;i <= n;i ++)
	{
        cin >> f[i];
//        if(c > f[i])
//        {
//        	c = f[i];
//        	ch = i;
//		}
    }
	for(int i = 1;i <= n;i ++)
	{
		for(int j = 1;j <= n;j ++)
		{
			cin >> z;
			if(!z)
			{
			    z = f[i];
			    e[i].p(mk(z,0));
			    e[0].p(mk(z,i));
			}
			e[i].p(mk(z,j));
			e[j].p(mk(z,i));
		}
	}
//	v[ch] = 1;
//	ans = c;
	for(int i = 0;i < e[0].size();i ++)
		q.push(e[0][i]);
	while(tot <= n)
	{
		int a = q.top().second,u = q.top().first;
		q.pop();
		if(v[a] && a != 0) continue;
// 		cout <<a << endl;
		v[a] = 1;
		ans += u;
		tot ++;
		for(int i = 0;i < e[a].size();i ++)
			q.push(e[a][i]);
	}
	cout << ans << endl;
	return 0;
}
2024/8/6 11:13
加载中...