题目链接
题目翻译:
小镇上有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;
}
总结:
有思路之后还是应该再多想几分钟,换种思路可能花费的时间就会少很多很多。一开始理解错了,以为所有的地区应该连成一条直线,到最后了才反应过来…