#include<iostream>
#include<string>
#include<list>
#include<queue>
using namespace std;
//广度遍历法==》然后将每层访问的第一个点最为转节点
typedef struct Relation_
{
int one;
int two;
}Relation;
typedef struct Adjacen_
{
int num;
int*adjacen;
int count;
}Adjacen;
void GetAdjacen(list<Relation>mData,Adjacen**Node)
{
int size=mData.size();
*Node=new Adjacen[size];
int i=0;
for(i=0;i<size;i++)
{
(*Node)[i].num=i+1;
(*Node)[i].count=0;
(*Node)[i].adjacen=new int[size];
}
list<Relation>::iterator mIt;
mIt=mData.begin();
int num=-1,num2=-1;
Adjacen temp_Node,temp_Node2;
while(mIt!=mData.end())
{
num=(*mIt).one-1;
num2=(*mIt).two-1;
temp_Node=(*Node)[num];
temp_Node2=(*Node)[num2];
temp_Node.adjacen[temp_Node.count]=num2+1;
temp_Node2.adjacen[temp_Node2.count]=num+1;
temp_Node.count++;
temp_Node2.count++;
(*Node)[num]=temp_Node;
(*Node)[num2]=temp_Node2;
mIt++;
}
}
int Output(list<Relation>mData,int sender)
{
Adjacen*Node=NULL;
GetAdjacen(mData,&Node);
//打印邻接点
for(int l=0;l<mData.size();l++)
{
if(Node[l].count>0)cout<<" 编号: "<<Node[l].num<<" 邻接点数:"<<Node[l].count<<" 分别为:";
else continue;
for(int q=0;q<Node[l].count;q++)
{
cout<<Node[l].adjacen[q]<<" ";
}
cout<<endl;
}
queue<int>mQueue;
int* zhuanJieDian=new int[mData.size()];
int count=0;
int num=-1;
//开始时,以sender为起点,获取其邻接点;
int i=0;
//-1=未遍历;0=已遍历;1=作为转节点且遍历了
for(i=0;i<mData.size();i++)
{
zhuanJieDian[i]=-1;
}
for(i=0;i<Node[sender-1].count;i++)
{
int temp_num=Node[sender-1].adjacen[i];
mQueue.push(temp_num);
zhuanJieDian[temp_num-1]=0;
}
while(!mQueue.empty())
{
num=mQueue.front();
if(zhuanJieDian[num-1]==0)
{
int j=0;
bool zhuan_Flag=false;
int temp_num2=-1;
for(j=0;j<Node[num-1].count;j++)
{
temp_num2=Node[num-1].adjacen[j];
if(zhuanJieDian[temp_num2-1]==-1)
{
zhuan_Flag=true;
zhuanJieDian[temp_num2-1]=0;
mQueue.push(temp_num2);
}
}
if(zhuan_Flag)
{
count++;
zhuanJieDian[num-1]=1;
}
}
mQueue.pop();
}
cout<<"作为转节点如下:"<<endl;
for(i=0;i<mData.size();i++)
{
if(zhuanJieDian[i]==1)cout<<i+1<<" ";
}
cout<<endl;
return count;
}
void main()
{
int sender;
list<Relation> mData;
cout<<"Sender"<<endl;
cin>>sender;
cout<<"Relationship"<<endl;
string str;
//cin>>str;
int one=0,two=0;
int pos=0;
Relation rela;
/* while(str.compare("End")!=0)
{
pos=str.find(',');
one=atoi(str.substr(0,pos).c_str());
two=atoi(str.substr(pos+1).c_str());
rela.one=one;
rela.two=two;
mData.push_back(rela);
cin>>str;
}
*/
rela.one=1;
rela.two=2;
mData.push_back(rela);
rela.one=1;
rela.two=3;
mData.push_back(rela);
rela.one=1;
rela.two=4;
mData.push_back(rela);
rela.one=2;
rela.two=5;
mData.push_back(rela);
rela.one=2;
rela.two=6;
mData.push_back(rela);
rela.one=3;
rela.two=6;
mData.push_back(rela);
rela.one=4;
rela.two=6;
mData.push_back(rela);
rela.one=4;
rela.two=7;
mData.push_back(rela);
rela.one=5;
rela.two=6;
mData.push_back(rela);
rela.one=5;
rela.two=8;
mData.push_back(rela);
rela.one=5;
rela.two=9;
mData.push_back(rela);
rela.one=6;
rela.two=7;
mData.push_back(rela);
rela.one=6;
rela.two=8;
mData.push_back(rela);
rela.one=6;
rela.two=9;
mData.push_back(rela);
rela.one=7;
rela.two=9;
mData.push_back(rela);
rela.one=10;
rela.two=7;
mData.push_back(rela);
cout<< Output(mData,sender)<<endl;
}