延禧攻略
皇宫之中,乾隆皇帝嫔妃众多,分为多派,经常互相争宠,乾隆皇帝正为此发愁,
他请魏璎珞替他想想办法,希望后宫之中尽可能少的分派。
魏璎珞把后宫中的众多嫔妃叫来,每位嫔妃将自己要好的姐妹名字写在一张字条上。
只要名单中有对方名字,就表示想与对方交好,则分在一派。
例如高贵妃名单中有纯妃,纯妃名单中有富察皇后,则她们三人都会归为一派,
如娴妃名单中没有任何人,其他嫔妃的名单中也没有娴妃,则娴妃自己为一派。
魏璎珞给每位嫔妃编上号,从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();
}