void step() { std::queue<int> Q; // for BFS // Initialize arrays std::fill(intree_n, intree_n + n, false); std::fill(intree_m, intree_m + m, false); std::fill(parent, parent + n, -1); // Find root for(int i = 0; i < n; ++i) if(match_n[i] == -1) { Q.push(i); intree_n[i] = true; std::fill(where_min_cost, where_min_cost + m, i); break; } while(true) { while(!Q.empty()) { int cur = Q.front(); Q.pop(); for(int i = 0; i < m; ++i) if(!intree_m[i] && updated_cost(cur, i) == 0) { if(match_m[i] == -1) { finish_step(cur, i); return; } intree_m[i] = true; insert_into_tree(match_m[i], cur); Q.push(match_m[i]); } } update_labels(); for(int i = 0; i < m; ++i) if(!intree_m[i] && get_min_cost(i) == 0) { if(match_m[i] == -1) { finish_step(where_min_cost[i], i); return; } else { intree_m[i] = true; if(!intree_n[match_m[i]]) { Q.push(match_m[i]); insert_into_tree(match_m[i], where_min_cost[i]); } } } } }
int S2S_Handle_join(user_t* user,char* buf,struct sockaddr_in *cliaddr) { char* ptr = ((struct text_join_s2s*)buf)->channelname; //if(Sch_channel_list(ptr) != NULL) //return 1; printf("%s:%d %s:%d recv S2S Join %s\n",inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port),inet_ntoa(cliaddr->sin_addr),ntohs(cliaddr->sin_port),ptr); channel_t* channel = Sch_channel_list(ptr); if(channel == NULL) { s2s_join(cliaddr,ptr,1); //s2s Add_channel_list(ptr); insert_into_tree(ptr,adj_server); } return 0; }
int s2s_join(struct sockaddr_in* fromaddr,char *channelname,int type){ insert_into_tree(channelname,adj_server); text_join_s2s buf; buf.txt_type = TXT_JOIN_S2S; strcpy(buf.channelname,channelname); server_node *cur = adj_server; if(type == 0){ //c2s while(cur){ sendto(sockfd,(char*)&buf,sizeof(text_join_s2s)+1,0,(struct sockaddr*)&(cur->addr),sizeof(struct sockaddr_in)); printf("%s:%d %s:%d send S2S Join %s\n",inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port),inet_ntoa(cur->addr.sin_addr),ntohs(cur->addr.sin_port),channelname); cur = cur->next; } }else{//s2s while(cur){ if(cur->addr.sin_addr.s_addr!=fromaddr->sin_addr.s_addr || cur->addr.sin_port!=fromaddr->sin_port){ sendto(sockfd,(char*)&buf,sizeof(text_join_s2s)+1,0,(struct sockaddr*)&(cur->addr),sizeof(struct sockaddr_in)); printf("%s:%d %s:%d send S2S Join %s\n",inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port),inet_ntoa(cur->addr.sin_addr),ntohs(cur->addr.sin_port),channelname); } cur = cur->next; } } return 0; }