Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:思路一样 用STL自带的优先队列超时,无奈之下只能自己写一个堆。。。

Posted by threedonkey at 2012-02-15 13:00:13 on Problem 2908
In Reply To:思路一样 用STL自带的优先队列超时,无奈之下只能自己写一个堆。。。 Posted by:zihuacs at 2010-08-21 21:20:35
兄弟,看看这个

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

#define MAXL 25
#define MAXNop 35
#define MAXNw 25
#define MAXS 1100000

struct queueNode{
	int state;
	int step;
	friend bool operator<(queueNode A, queueNode B){
		return (A.step > B.step);
	}
};

struct operNode{
	char method[MAXL];
	int cost;
};

int bit[MAXL], len;
priority_queue<queueNode> Q;
operNode oper[MAXNop];
int exist[MAXS];

int btod(char *str){
	int ans = 0;
	for(int i = 0; i < len; ++ i){
		ans += (str[i] - '0') * bit[i];
	}
	return ans;
}

int change(int num, int id){
	for(int i = 0; i < len; ++ i){
		switch (oper[id].method[i]){
		case 'N':	break;
		case 'F':	num ^= bit[i];
					break;
		case 'S':	num |= bit[i];
					break;
		case 'C':	if(num & bit[i]) num ^= bit[i];
					break;
		}
	}
	return num;
}

int bfs(int st, int ed, int nop){
	while(!Q.empty()) Q.pop();
	queueNode temp;
	temp.state = st;
	temp.step = 0;
	Q.push(temp);
	memset(exist, 0, sizeof(exist));
	while(!Q.empty()){
		queueNode h = Q.top();
		Q.pop();
		if(h.state == ed) return h.step;
		for(int i = 0; i < nop; ++ i){
			int num = change(h.state, i);
			if(!exist[num] || exist[num] > h.step + oper[i].cost){
				temp.state = num;
				temp.step = h.step + oper[i].cost;
				exist[num] = temp.step;
				Q.push(temp);
			}
		}
	}
	return -1;
}


int main(){
	int CASE, nop, nw, st, ed, head, tail, ans;
	char str1[MAXL], str2[MAXL];
	for(bit[0] = len = 1; len < 23; ++ len) bit[len] = bit[len - 1] * 2;
	scanf("%d", &CASE);
	while(CASE --){
		scanf("%d %d %d", &len, &nop, &nw);
		for(int i = 0; i < nop; ++ i) scanf("%s %d", oper[i].method, &oper[i].cost);
		while(nw --){
			scanf("%s %s", str1, str2);
			st = btod(str1);
			ed = btod(str2);
			ans = bfs(st, ed, nop);
		    if(ans < 0) printf("NP");
			else printf("%d", ans);
			printf("%c", nw ? ' ' : '\n');
		}
	}
	return 0;
}

360MS

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator