Пример #1
0
// 起点开始搜索
int dfs_large(int id, bool inload[], int cnt, int &best_cost, bool flag = false)
{
	//cout << "dfs(" << id << "," << cnt << ")" << endl;
	if(id == eid)
	{
		best_cost = update_ans(ans_sum,ans);
		//update_good(ans_sum,ans);
		return FIND_SOLVE;	
	}
	
	if(is_timeout())
	{
		return TIME_OUT; // time out
	}

	// start bfs
	
	int (&last)[MAX_NODE_NUM] = g_last[cnt];
	int (&w)[MAX_NODE_NUM] = g_w[cnt];
	int (&dis)[MAX_NODE_NUM] = g_dis[cnt];
	
	for(int i=0;i<node_size;i++)
	{
		last[i] = w[i] = dis[i] = -1;
	}	

	int (&que)[MAX_NODE_NUM] = g_que[cnt];
	int front = 0;
	int rear = 0;
	int find_cnt = 0;
	int find_cnt_limit = find_cnt_up;
	if(cnt == must_node_cnt)
		find_cnt_limit = 3;
	if(cnt == 1)
		find_cnt_limit = node_size*8;
	w[id] = 0;
	dis[id] = 0;
	que[rear++] = id;
	
	// 只剩下最后一个节点 , spfa
	if(cnt == 0)
	{
		int que_tag[MAX_NODE_NUM] = {0};
		que_tag[id] = true;
		while(front != rear)
		{
			
			int now_id = que[front++];
			if(front == MAX_NODE_NUM)
				front = 0;
			for(int i=0; i<node_next[now_id].size(); i++)
			{
				int r_node = edge_set[node_next[now_id][i]].r;
				if(inload[r_node])
					continue;
				if(w[r_node] == -1 || w[now_id] + edge_set[node_next[now_id][i]].cost < w[r_node])
				{
					w[r_node] = w[now_id] + edge_set[node_next[now_id][i]].cost;
					last[r_node] = now_id;
					if(!que_tag[r_node])
					{
						que_tag[r_node] = true;
						que[rear++] = r_node;
						if(rear==MAX_NODE_NUM)
							rear = 0;
					}
				}
			}
			que_tag[now_id] = false;
		
		}
		
		if(w[eid] == -1)
			return cnt+1;

		int t_ans_sum = ans_sum;
		vector<int> load_nodes;
		load_nodes.push_back(eid);
		int tmp_id = eid;

		while(last[tmp_id] != -1)
		{
			tmp_id = last[tmp_id];
			load_nodes.push_back(tmp_id);				
		}
				
		reverse(load_nodes.begin(),load_nodes.end());
		for(int i=0;i<load_nodes.size();i++)
		{
			//inload[load_nodes[i]] = true;
			if(i < load_nodes.size() - 1)
			{
				add_edge(load_nodes[i],load_nodes[i+1],ans_sum,ans);
			}
		}

		best_cost = update_ans(ans_sum,ans);
		//update_good(ans_sum,ans);

		ans_sum =  t_ans_sum;
				
		return FIND_SOLVE;
	}

	int fin_res = cnt;
	int t_best_cost = 2000000;
	
	while(front < rear && find_cnt < find_cnt_limit)
	{

		
		if(cnt >= must_node_cnt - 5 && front > 0 && w[que[front]] != w[que[front-1]])
		{
			vector<pair<int,int> > pp;
			for(int i=front;i<rear;i++)
				pp.push_back(MP(dis[que[i]],que[i]));
			sort(pp.begin(),pp.end());
			for(int i=front;i<rear;i++)
				que[i] = pp[i-front].second;
		}

		int now_id = que[front++];
		for(int i=0; i<node_next[now_id].size(); i++)
		{
			int r_node = edge_set[node_next[now_id][i]].r;
			if(inload[r_node] || w[r_node] != -1)
				continue;
			
			if(must_node[r_node] || (cnt == 0 && r_node == eid) )
			{
				int t_ans_sum = ans_sum;
				//vector<int> load_nodes;
				vector<int> edge_nodes;
				//load_nodes.push_back(r_node);
				//load_nodes.push_back(now_id);
				edge_nodes.push_back(node_next[now_id][i]);
				int tmp_id = now_id;

				while(last[tmp_id] != -1)
				{
					tmp_id = last[tmp_id];
					//load_nodes.push_back(tmp_id);				
					edge_nodes.push_back(tmp_id);
					tmp_id = edge_set[tmp_id].l;				
				}
				
				reverse(edge_nodes.begin(),edge_nodes.end());
				for(int i=0;i<edge_nodes.size();i++)
				{
					//inload[load_nodes[i]] = true;
					inload[edge_set[edge_nodes[i]].r] = true;
					/*					
					if(i < load_nodes.size() - 1)
					{
						add_edge(load_nodes[i],load_nodes[i+1],ans_sum,ans);
					}
					*/
					ans[ans_sum++] = edge_nodes[i];
				}

				find_cnt ++;
				int t_t_best_cost = 2000000;
				int res = dfs_large(r_node, inload, cnt - 1, t_t_best_cost, flag);
				//find_cnt --;
				t_best_cost = min(t_best_cost,t_t_best_cost);
				best_cost = min(t_best_cost,best_cost);

				ans_sum =  t_ans_sum;
				
				for(int i=0;i<edge_nodes.size();i++)
				{
					inload[edge_set[edge_nodes[i]].r] = false;
				}
				if(res == END_OUT)
					return res;

				fin_res = min(res, fin_res);
				int min_l = 8;
				int min_g = 8;
				if(!flag)
				{
					if(good_cost < INF_COST)
					{
						min_l = 5;
						min_g = 13;
					}
					if(cnt > min_l && cnt < must_node_cnt - min_g)
						return fin_res;
//else if((cnt > min_l) && cnt < must_node_cnt - min_g + 3 && (fin_res > 0 || t_best_cost - 20 > good_cost))					
else if(cnt > min_l - 1 && cnt < must_node_cnt - min_g + 5 && (fin_res > 0 || t_best_cost - 3 > good_cost))
						return fin_res;
				}
				else
				{
					min_l = 6;
					min_g = 10;
					if(must_node_cnt > 22)
					{
						min_l = 8;
						min_g = 10;
					}
					if(good_cost < INF_COST)
					{
						if(node_size >= 300)
						{				
							min_l = 6;
							min_g = 12;
						}
						else
						{
							min_l = 6;
							min_g = 10;
						}
						if(must_node_cnt > 22)
						{
							min_l = 8;
							min_g = 6;
						}
					}
					if(cnt > min_l && cnt < must_node_cnt - min_g )//&& t_best_cost > good_cost)
						return fin_res;
					else if(cnt < must_node_cnt - min_g - 2 && (t_best_cost - 3  > good_cost || cnt > 0) )
						return fin_res;
				}
				

			} 
			else 
			{
				w[r_node] = w[now_id] + 1;
				dis[r_node] = dis[now_id] + edge_set[node_next[now_id][i]].cost;
				//last[r_node] = now_id;
				last[r_node] = node_next[now_id][i];
				que[rear++] = r_node;
			}
			
		}
	}
	return fin_res;

}
Пример #2
0
//你要完成的功能总入口
void search_route(char *topo[5000], int edge_num, char *demand)
{
	
	start_time = get_now_time();
	read_topo(topo);
	read_demand(demand);
	
	if((node_size<=100) || node_size > 500)
	{
		int tmp_up = find_cnt_up + 2;
		bool flag = false;
		
		if(node_size<=500)
		{
			flag = true;
		}
		if(node_size <= 100) // 顶点小于100搜一次即可
		{
			find_cnt_up = 4;
			tmp_up = find_cnt_up+1;
		}
		else if(must_node_cnt < 15)
		{
			tmp_up++;
			find_cnt_up++;
		}
	
		//if(node_size >= 200)
		//	tmp_up += 5;
	
		cout << "flag:" << flag << endl; 
	
		while(find_cnt_up < tmp_up) //&& good_cost < last_cost)
		{
			//last_cost = good_cost;
			bool tag[MAX_NODE_NUM] = {0};
			int cnt = must_node_cnt;

		 	tag[sid] = true;
			int now_time = get_now_time();
			int res,tb;
			if(node_size>=100 && node_size<150) 
				res = dfs(sid,tag,cnt,tb);		
			else res = dfs_large(sid,tag,cnt,tb,flag);

			if(res == END_OUT)
				break;
			cout << "find res : " << res << endl;	
			find_cnt_up++;
		}
	}
	else 
	{
		lp_solver(sid,eid,edge_cnt,edge_set,node_size,must_node,ans_sum,ans,node_next);
		update_ans(ans_sum,ans);
	}

	//cout << ans_sum << endl;
	cout << "route_len: " << good_sum << endl;
	cout << "good_cost: " << good_cost << endl;

	for (int i = 0; i < good_sum; i++)
	{
	      if (0 == i)
			//cout << edge_set[ans[i]].edge_id;
			cout << good_ans[i];
	      else cout<< "|" << good_ans[i];
	
  	      record_result(edge_set[good_ans[i]].edge_id);
	}
	cout << endl;		
	end_time = get_now_time();
	cout << "used time : " << (end_time - start_time) << endl;

}
Пример #3
0
    vector<vector<int>> palindromePairs(vector<string>& words) 
    {   
    	ans.clear();
    	check_rep.clear();
    	tot = words.size();
    	
    	ori_map.clear();
    	for (int i=0;i<words.size();++i)
    		ori_map.emplace(words[i], i);

    	vector<string> rev(words);
    	rev_map.clear();
    	for (int i=0;i<rev.size();++i)
    	{
    		reverse(rev[i].begin(), rev[i].end());
    		rev_map.emplace(rev[i],i); 
    	}
    	
    	set<int> pal_set;
    	string tmp;
    	
    	for (int i=0;i<words.size();++i)
    	{
    	    pal_set.clear();
    	    pal_set = manacher(words[i]);
    	    
    // 	    printf("Word %d palindrome suffix: ",i);
    // 		for (set<int>::iterator it = pal_set.begin(); it != pal_set.end(); ++it) 
    // 			printf("%d ", *it);
    // 		printf("\n");
    		
    	    const string &cur = words[i];
    	    tmp = "";
    	    for (int j=0;j<cur.length();tmp+=cur[j++])
    	    {
    	        if (pal_set.find(cur.length()-j) != pal_set.end() && rev_map.find(tmp) != rev_map.end())
    	            update_ans(i, rev_map[tmp]);
    	    }
    	    if (rev_map.find(tmp) != rev_map.end()) update_ans(i, rev_map[tmp]);
    	}
        
        
        for (int i=0;i<words.size();++i)
        {
            pal_set = manacher(rev[i]);
            
    //         printf("Word %d palindrome prefix: ",i);
    // 		for (set<int>::iterator it = pal_set.begin(); it != pal_set.end(); ++it) 
    // 			printf("%d ", *it);
    // 		printf("\n");
    		
            const string &cur = words[i];
            tmp = "";
            for  (int j=cur.length(); j>0; tmp+=cur[--j])
            {
                // cout << j<< ":" << tmp << endl;
                if (pal_set.find(j) != pal_set.end() && ori_map.find(tmp) != ori_map.end())
                    update_ans(ori_map[tmp], i);
            }
            if (ori_map.find(tmp) != ori_map.end()) update_ans(ori_map[tmp],i);
        }
    	return ans;
    }