记录编号 |
351462 |
评测结果 |
AAAAAAAAAA |
题目名称 |
冰桥,升起来了! |
最终得分 |
100 |
用户昵称 |
srO cwm Orz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.196 s |
提交时间 |
2016-11-16 16:15:45 |
内存使用 |
1.69 MiB |
显示代码纯文本
/*
状态定义:fa[u]表示从B方v点转移到A方u点时最大的考察值之和 fb同
转移方程:fa[u]=max{fb[v]+wa[u]} fb[v]=max{fa[u]+wb[v]}
边界:fa[i]=wa[i],fb[i]=wb[i]
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 40010;
pair<int,int> edge[100003];
int A,B,K;
int wa[maxn],wb[maxn];
int fa[maxn],fb[maxn];
int ans;
int main(){
#ifndef DEBUG
string FileName="meibridge";
freopen((FileName+".in").c_str(),"r",stdin);
freopen((FileName+".out").c_str(),"w",stdout);
#endif
scanf("%d%d%d",&A,&B,&K);
for(int i = 1; i <= A; i++)scanf("%d",&wa[i]),fa[i]=wa[i];
for(int i = 1; i <= B; i++)scanf("%d",&wb[i]),fb[i]=wb[i];
for(int i = 0; i < K; i++)scanf("%d%d",&edge[i].first,&edge[i].second);
sort(edge,edge+K);
for(int i = 0; i < K; i++){
int u = edge[i].first;
int v = edge[i].second;
int ffa=fa[u];
int ffb=fb[v];
fa[u]=max(fa[u],ffb+wa[u]);
fb[v]=max(fb[v],ffa+wb[v]);
}
for(int i = 1; i <= A; i++)ans=max(ans,fa[i]);
for(int i = 1; i <= B; i++)ans=max(ans,fb[i]);
printf("%d",ans);
}