分群源程序

来源:互联网 发布:淘宝直通车收费贵 编辑:程序博客网 时间:2024/06/04 17:44
#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;}