トピックリンク
質問の意味:私は街を与えれば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;
}