| 记录编号 | 351381 | 评测结果 | TATWTTTTTT | 
    
        | 题目名称 | 2550.冰桥,升起来了! | 最终得分 | 10 | 
    
        | 用户昵称 |  Tabing010102 | 是否通过 | 未通过 | 
    
        | 代码语言 | C++ | 运行时间 | 8.027 s | 
    
        | 提交时间 | 2016-11-16 15:05:56 | 内存使用 | 1.53 MiB | 
    
    
    
    		显示代码纯文本
		
		#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 40000+10;
FILE *fin, *fout;
int nA, nB, K, valA[maxn], valB[maxn];
struct Bridge {
	int from, to;
	Bridge(int a, int b) { from=a; to=b; }
};
vector<Bridge> bridges;//其中B侧的编号为原始编号
vector<int> brA[maxn];
vector<int> brB[maxn];
void AddBridge(int u, int v) {
	bridges.push_back(Bridge(u, v));
	bridges.push_back(Bridge(v, u));
	int m = bridges.size();
	brA[u].push_back(m-2);
	brB[u].push_back(m-1);
}
int ans=0;
inline int max(int a, int b) { return a<b?b:a; }
vector<Bridge> cnt_bridges;//其中B侧编号已经加maxn
vector<Bridge>::iterator it;
bool isx(int id, int w1, int w2) {
	if(id == 0) {//A侧
		Bridge x = bridges[brA[w1][w2]];
		x.to += maxn;
		for(it = cnt_bridges.begin(); it != cnt_bridges.end(); it++) {
			if(x.from<it->from && x.to>it->to) return true;
			if(x.from>it->from && x.to<it->to) return true;
		}
		return false;
	} else {//B侧
		Bridge x = bridges[brB[w1][w2]];
		x.from += maxn;
		for(it = cnt_bridges.begin(); it != cnt_bridges.end(); it++) {
			if(x.to<it->from && x.from>it->to) return true;
			if(x.to>it->from && x.from<it->to) return true;
		}
		return false;
	}
}
void dfs(int now, int cnt) {
	if(now <= maxn) {//A侧
		bool moved = false;
		for(int i = 0; i < brA[now].size(); i++) {
			if(isx(0, now, i)) continue;
			moved = true;
			Bridge &x = bridges[brA[now][i]];
			cnt_bridges.push_back(Bridge(now, x.to+maxn));
			dfs(x.to+maxn, cnt+valA[now]);
			cnt_bridges.pop_back();
		}
		if(!moved) ans = max(ans, cnt+valA[now]);
	} else {//B侧
		now -= maxn;
		bool moved = false;
		for(int i = 0; i < brB[now].size(); i++) {
			if(isx(1, now, i)) continue;
			moved = true;
			Bridge &x = bridges[brB[now][i]];
			cnt_bridges.push_back(Bridge(x.to, now+maxn));
			dfs(x.to, cnt+valB[now]);
			cnt_bridges.pop_back();
		}
		if(!moved) ans = max(ans, cnt+valB[now]);
	}
}
int main() {
	fin = fopen("meibridge.in", "r");
	fout = fopen("meibridge.out", "w");
	fscanf(fin, "%d%d%d", &nA, &nB, &K);
	for(int i = 1; i <= nA; i++) fscanf(fin, "%d", &valA[i]);
	for(int i = 1; i <= nB; i++) fscanf(fin, "%d", &valB[i]);
	for(int i = 1; i <= K; i++) {
		int u, v;
		fscanf(fin, "%d%d", &u, &v);
		AddBridge(u, v);
	}
	//dfs时1~maxn表示在A侧, maxn+1~maxn*2表示在B侧
	for(int i = 1; i <= nA; i++) dfs(i, 0);
	for(int i = 1; i <= nB; i++) dfs(i+maxn, 0);
	fprintf(fout, "%d\n", ans);
	return 0;
}