codeforces Round #677 (Div. 3) 1433D Districts Connection

it2025-12-29  8

题目链接

题目翻译:

小镇上有n个地区,第i个地区属于帮派ai。最开始所有地区之间都没有道路连接。 你是这个城市的市长,并想建立n-1条道路连接所有地区(两个地区可以被直接连接,也可以通过其它地区间接连接)。 如果两个属于同一帮派的地区被直接连接,则会起冲突。 你不想让这种事情发生,所以你的任务是建立n-1条道路,使得所有的地区都是可以相互抵达的(可能通过其他地区抵达)并且任意两个直接连接的地区属于不同的帮派。或者回答无法建立满足条件的n-1条道路。 你需要回答t个独立的测试用例。

我的解题思路:

可以先整理出所有属于同一帮派的地区,再以下图的方式连接所有地区。 先拿出一个1,把所有2都连接到这个1上,再把所有3都连接到同一个2上,以此类推,最后把剩下的1都连接到同一个4上就可以了。这样所有属于相同帮派的地区就不会相连接了。 另一个就是怎么判断结果是否存在。显然,当所有地区都属于同一帮派的时候,结果不存在。

我的代码:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cstdio> #include<cmath> #define inf 0x3f3f3f3f using namespace std; vector<int>v,vv[5010]; map<int,int>mm; int main() { // freopen("1.txt","r",stdin); int t,n,a; cin>>t; while(t--) { cin>>n; v.clear(); mm.clear(); int num=1,maxlen=0,maxnum=0; for(int i=1; i<=n; i++) { cin>>a; if(mm[a]==0) { mm[a]=num; vv[num].clear(); num++; } vv[mm[a]].push_back(i); if(vv[mm[a]].size()>maxlen) { maxlen=vv[mm[a]].size(); maxnum=mm[a]; } } if(maxlen==n){ cout<<"NO"<<endl; continue; } cout<<"YES"<<endl; int start = vv[1][0]; for(int i=2;i<num;i++){ for(int j=0;j<vv[i].size();j++){ cout<<start<<" "<<vv[i][j]<<endl; } start=vv[i][0]; } for(int i=1;i<vv[1].size();i++){ cout<<start<<" "<<vv[1][i]<<endl; } } return 0; }
官方的解题思路:

看了答案,比我想的简单多了,随便找出一个任意帮派a的地区,将其他所有不属于帮派a的地区都连接到这个地区上,最后把帮派a剩余的地区连接到任意一个不属于帮派a的地区上。

代码:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cstdio> #include<cmath> #define inf 0x3f3f3f3f using namespace std; const int N = 5050; int a[N]; vector<int>v; int main(){ // freopen("1.txt","r",stdin); int t,n,flag,k; cin>>t; while(t--){ cin>>n; v.clear(); flag=0; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]!=a[1]) flag=1; } if(flag==0){ cout<<"NO"<<endl; continue; } cout<<"YES"<<endl; for(int i=2;i<=n;i++){ if(a[i]==a[1]) v.push_back(i); else{ cout<<1<<" "<<i<<endl; k=i; } } for(int i=0;i<v.size();i++){ cout<<k<<" "<<v[i]<<endl; } } return 0; }
总结:

有思路之后还是应该再多想几分钟,换种思路可能花费的时间就会少很多很多。一开始理解错了,以为所有的地区应该连成一条直线,到最后了才反应过来…

最新回复(0)