玄关最小生成树小问题
  • 板块学术版
  • 楼主houluyu
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/6 16:53
  • 上次更新2024/8/6 17:42:52
查看原帖
玄关最小生成树小问题
690243
houluyu楼主2024/8/6 16:53

P5687 [CSP-S2019 江西] 网格图 这个题

同样代码if(k == n * m - 1)break;对了

if(k >= n * m - 1)break;

就不对了不理解求解答 完整代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 500005;
int n, m, k;
ll edg1[N], edg2[N], ans;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i ++)//横向 
    {
		cin >> edg1[i];
	}
	for(int i = 1; i <= m; i ++)//纵向 
	{
		cin >> edg2[i];
	}
	sort(edg1 + 1, edg1 + 1 + n);
	sort(edg2 + 1, edg2 + 1 + m);
	int heng = 1, zong = 1;//已经加了几条横的边 
	ans = ans + edg1[1] * (m - 1) + edg2[1] * (n - 1);
	k = n + m - 2;
	edg1[n + 1] = edg2[m + 1] = 0x7fffffff;
	int l = 2, r = 2;
	while(1)
	{
		if(edg1[l] <= edg2[r])//用横向 
		{
			k += m - zong;
			ans = ans + edg1[l] * (m - zong);
			heng ++; 
			l ++;
		}
		else//用纵向 
		{
			k += n - heng;
			ans = ans + edg2[r] * (n - heng);
			zong ++ ; 
			r ++ ;
		}
		if(k == n * m - 1)break;
	}
	cout << ans;
	return 0;
	
}
2024/8/6 16:53
加载中...