Codeforcesラウンド#597(本部2)D. Shichikujiとパワーグリッド(最小スパニングツリー)

トピックリンク
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
質問の意味:私は街を与えればn個の都市があります初めに(座標の形で与えられる)に通電されていない、伝導はCIを取り、市は電気を持っていると仮定し、街へとB建設側を構築しますその後、(b)は、すべての都市のための最小コストを活性化しようとしている、マンハッタンからそれらの座標を過ごす、電力変換器を持っていることはありません。
考える:私たちは、私はCIある街にエッジスーパー源0,0の権利を確立しているし、その後、各点がエッジに接続され、完全なグラフを作成した後、最小スパニングツリーについて尋ねると、答えです。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+10;
typedef long long ll;
struct node{
	ll U,V,dis;
};
int n,father[maxn],cnt=0;
ll sum=0,c[maxn],k[maxn],x[maxn],y[maxn];
vector<int>ans;
vector<node>v;
vector<pair<int,int>>temp;
bool cmp(const node &a,const node &b)
{
	return a.dis<b.dis;
}
int findfather(int x)
{
	if(x==father[x]) return x;
	int i=findfather(father[x]);
	father[x]=i;
	return i;
}
int main()
{
	scanf("%lld",&n);
	for(int i=0;i<=n;++i) father[i]=i;
	for(int i=1;i<=n;++i) scanf("%lld%lld",&x[i],&y[i]);
	for(int i=1;i<=n;++i) scanf("%lld",&c[i]);
	for(int i=1;i<=n;++i) scanf("%lld",&k[i]);
	for(int i=1;i<=n;++i)
	for(int j=i+1;j<=n;++j)
	v.push_back({i,j,1ll*(k[i]+k[j])*(abs(x[i]-x[j])+abs(y[i]-y[j]))});
	for(int i=1;i<=n;++i) v.push_back({0,i,c[i]});
	sort(v.begin(),v.end(),cmp);
	for(int i=0;i<v.size();++i)
	{
		int fa=findfather(v[i].U),fb=findfather(v[i].V);
		if(fa!=fb)
		{
			father[fa]=fb;
			if(v[i].U==0) ans.push_back(v[i].V); 
			else temp.push_back({v[i].U,v[i].V}); 
			sum+=v[i].dis;
			cnt++;
			if(cnt==n) break;
		}
	}
	cout<<sum<<endl;
	cout<<ans.size()<<endl;
	for(int i=0;i<ans.size();++i) cout<<ans[i]<<" ";
	cout<<endl;
	cout<<temp.size()<<endl;
	for(int i=0;i<temp.size();++i) cout<<temp[i].first<<" "<<temp[i].second<<endl; 
}
公開された111元の記事 ウォンの賞賛0 ビュー4004

おすすめ

転載: blog.csdn.net/qq_42479630/article/details/104434538