#include<iostream>#include<fstream>#include<sstream>#include<string>using namespace std;struct Node{//節點座標double x,y;//節點idint id;//節點狀態0 1 2 3,分別表示管理者 群首 群成員 未分群節點int state;//鄰居個數int num_of_neigh;//鄰居節點列表int neighbor[10];//群成員個數int num_of_group;//群成員列表int groupmember[10];//節點的權值double w;Node(){num_of_neigh=0;num_of_group=0;state=3;}};int N;Node nd[31];int group_manager_id;double group_manager_x,group_manager_y;//判斷某個節點是不是鄰居節點中w值最小的bool is_neigh_smallest(int id){bool flag=false;for(int i=0;i<nd[id].num_of_neigh;i++){if(nd[id].w<nd[nd[id].neighbor[i]].w){flag=true;break;}}if(flag)return false;return true;}//修改鄰居節點的狀態為群成員,並加入到群首的群成員中void modify_neighbor_state(int id){for(int i=0;i<nd[id].num_of_neigh;++i){//只有鄰居節點為未分群狀態時,才會修改為群成員if(nd[nd[id].neighbor[i]].state==3){nd[nd[id].neighbor[i]].state=2;nd[id].groupmember[nd[id].num_of_group++]=nd[id].neighbor[i];}}}//查看是否還有未成群的節點int find_un_grouped(){for(int i=1;i<=N;++i)if(nd[i].state==3)return i;return 0;}int main(){int id;double x,y,weight,ntmp;//========================================================讀取initial.txtifstream fin;fin.open("initial.txt");while(fin>>id>>x>>y>>ntmp){if(id==0){N=ntmp;group_manager_id=id;group_manager_x=x;group_manager_y=y;}else{nd[id].id=id;nd[id].x=x;nd[id].y=y;nd[id].w=ntmp;}}fin.close();//========================================================讀取neighbor.txtfin.open("neighbor.txt");int from,neigh,i=0;string s;while(getline(fin,s)){for(istringstream sin(s);sin>>neigh;i++){if(i==0)from=neigh;else{nd[from].neighbor[nd[from].num_of_neigh++]=neigh;}}}fin.close(); //=========================================================產生群//第一步,根據指揮權來分,我在這兒直接設定幾個點有指揮權,設定id=11和15先產生//可以將11和15存在檔案中,然後讀取的方式int command_node_id;int group_head_num=0;fin.open("commandNode.txt");while(fin>>command_node_id){group_head_num++;nd[command_node_id].state=1;modify_neighbor_state(command_node_id);}fin.close();//對於剩下的節點進行按照權值進行分群while(int k=find_un_grouped()){for(i=k;i<=N;i++){if(nd[i].state==3&&is_neigh_smallest(i)){//修改群首和群成員狀態group_head_num++;nd[i].state=1;modify_neighbor_state(i);}}}//===================================輸入到ini_topo.txt中ofstream fout;fout.open("ini_topo.txt");fout<<group_manager_id<<" "<<group_manager_x<<" "<<group_manager_y<<endl;fout<<N<<endl;for(i=1;i<=N;++i){fout<<nd[i].id<<" "<<nd[i].state<<" "<<nd[i].x<<" "<<nd[i].y<<" "<<nd[i].w<<endl;}fout<<group_head_num<<endl;for(i=1;i<=N;++i){if(nd[i].state==1){for(int j=0;j<nd[i].num_of_group;++j){fout<<nd[i].id<<" "<<nd[i].neighbor[j]<<endl;}}}fout.close();return 0;}