Esempio n. 1
0
  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]);
            }
          }
        }
    }
  }
Esempio n. 2
0
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;
}
Esempio n. 3
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;
}