【CodeForces】Codeforces Round #677 (Div. 3) D. Districts Connection (思维)

D. Districts Connection

time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
There are n districts in the town, thei-th district belongs to the a_i-th bandit gang. Initially, no districts are connected to each other.

You are the mayor of the city and want to build n-1 two-way roads to connect all districts (two districts can be connected directly or through other connected districts).

If two districts belonging to the same gang are connected directly with a road, this gang will revolt.

You don’t want this so your task is to build n-1 two-way roads in such a way that all districts are reachable from each other (possibly, using intermediate districts) and each pair of directly connected districts belong to different gangs, or determine that it is impossible to build n-1 roads to satisfy all the conditions.

You have to answer t independent test cases.

Input
The first line of the input contains one integer t (1 \le t \le 500) — the number of test cases. Then t test cases follow.

The first line of the test case contains one integer n (2 \le n \le 5000) — the number of districts. The second line of the test case contains n integers a_1, a_2, \ldots, a_n (1 \le a_i \le 10^9), where a_i is the gang the i-th district belongs to.

It is guaranteed that the sum of n does not exceed 5000 (\sum n \le 5000).

Output
For each test case, print:

NO on the only line if it is impossible to connect all districts satisfying the conditions from the problem statement.
YES on the first line and n-1 roads on the next n-1 lines. Each road should be presented as a pair of integers x_iand y_i (1 \le x_i, y_i \le n; x_i \ne y_i), where x_i and y_i are two districts the i-th road connects.
For each road i, the condition a[x_i] \ne a[y_i] should be satisfied. Also, all districts should be reachable from each other (possibly, using intermediate districts).

Example

input

4
5
1 2 2 1 3
3
1 1 1
4
1 1000 101 1000
4
1 2 3 4

output

YES
1 3
3 5
5 4
1 2
NO
YES
1 2
2 3
3 4
YES
1 2
1 3
1 4

题意:

n个点 中添加 n-1条边,但是不能连接两个相同值的点,最终需要所有点互相可达。(答案不唯一)


思路:

开两个vector,一个记录某一个相同值的所有位置(一个团伙),另一个记录其他所有位置(其他所有团伙)

若该团伙只有一个人,那么就让他连接其他所有团伙中的点

若该团伙有多个人,那么让其中一个人连接其他所有团伙中的点,在从其他团伙中找任一点该团伙中其他人相连


代码:

#include
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
int t,n,x;
int main()
{
     	   
	cin>>t;
	while(t--)
	{
     
		vector<int> v,g; //v一个团伙 , g其他所有团伙
		int f;
		cin>>n>>f;
		v.push_back(1);
		for(int i=2;i<=n;i++)
		{
     
			cin>>x;
			if(x==f) v.push_back(i);
			else g.push_back(i);
		}
		
		if(v.size()==n) //都是一个团伙的,直接输出NO
		{
     
			cout<<"NO"<<endl;
		}
		else
		{
     
			int num=0;
			cout<<"YES"<<endl;
			for(int i=0;i<g.size();i++) //该团伙中第一人与其他团伙所有相连
			{
     
				cout<<1<<" "<<g[i]<<endl;
				num++;
			}
			
			if(num<n-1) //如果还没连完n-1条边(代表该团伙有多人)
			{
     
				int x=g[0]; //其他团伙中找一人
				for(int i=1;i<v.size();i++)
				{
     
					cout<<x<<" "<<v[i]<<endl; //与该团伙中其他人相连
				}
			}
		}
	}
	return 0;
}

你可能感兴趣的:(算法,算法,思维,模拟,codefoces)