6.8-娘娘站队-模拟

延禧攻略
皇宫之中,乾隆皇帝嫔妃众多,分为多派,经常互相争宠,乾隆皇帝正为此发愁,
他请魏璎珞替他想想办法,希望后宫之中尽可能少的分派。

魏璎珞把后宫中的众多嫔妃叫来,每位嫔妃将自己要好的姐妹名字写在一张字条上。
只要名单中有对方名字,就表示想与对方交好,则分在一派。

例如高贵妃名单中有纯妃,纯妃名单中有富察皇后,则她们三人都会归为一派,
如娴妃名单中没有任何人,其他嫔妃的名单中也没有娴妃,则娴妃自己为一派。

魏璎珞给每位嫔妃编上号,从1开始,共有n位嫔妃,每个人的名单写上想要交好的嫔妃编号,名单后面以0结尾。

互相交好或者间接交好的嫔妃分为一派,最后魏璎珞将分成的派别数上报给皇帝,皇帝十分满意。
皇上询问魏璎珞是如何划分的,魏璎珞将统计的字条给皇上看,字条如下:

10 //有10位嫔妃
0 //1号娴妃不想与任何人交好
5 3 0 //2号则希望能与5号3号姐妹一起
8 4 0
9 0
9 0
3 0
0
7 9 0
0
9 7 0

最后输出派数为 2,除了1号自己为一派,其他人都分为另外一派

1、比如3号与6号和8号交好,则他们仨应该取最小的作为统一的标号;
2、同时,其他标号为6或者8或者3的应该都统一成最小的那个标号;

#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int* g = new int[n+1];
	for(int i=0;i<n+1;i++)
	{
		g[i]=i;
	}
	for(int i=1;i<=n;i++)
	{
		int j;
		cin>>j;
		vector<int> tem;
		tem.push_back(i); 
		while(j != 0)
		{
			tem.push_back(j);
			cin>>j;
		}
		int min=g[tem[0]];
		for(int ii=0;ii<tem.size();ii++)
		{
			if(g[tem[ii]]<min)
			{
				min=g[tem[ii]];
			}
		}
		for(int ii=0;ii<tem.size();ii++)
		{
			g[tem[ii]]=min;
		}
		for(int ii=1;ii<=n;ii++)
		{
			for(int jj=0;jj<tem.size();jj++)
			{
				if(g[ii] == tem[jj])
				{
					g[ii]=min;
				}
			}
		}
	}
	map<int,int> tong;
	for(int i=1;i<=n;i++)
	{
		if(tong.find(g[i])==tong.end())
		{
			tong[g[i]]=1;
		}
	} 
	cout<<tong.size(); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章