#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; class Edge { public: int to, cap, rev; Edge(){}; Edge(int to0, int cap0){to = to0; cap = cap0;} Edge(int to0, int cap0, int rev0){to = to0; cap = cap0; rev = rev0;} }; int maxFlow(const vector >& edges0, int source, int sink) { static vector > edges; static vector index; static vector level; static int n; class Func{ public: static void bfs(int s){ level.assign(n, -1); queue q; level[s] = 0; q.push(s); while(!q.empty()){ int v = q.front(); q.pop(); for(unsigned i=0; i 0 && level[e.to] < 0){ level[e.to] = level[v] + 1; q.push(e.to); } } } } static int dfs(int s, int t, int f){ if(s == t) return f; for(unsigned& i=index[s]; i 0 && level[s] < level[e.to]){ int g = dfs(e.to, t, min(f, e.cap)); if(g > 0){ e.cap -= g; edges[e.to][e.rev].cap += g; return g; } } } return 0; } }; n = edges0.size(); edges.assign(n, vector()); for(int i=0; i 0) ret += f; } return 0; } const int INF = INT_MAX / 4; int main() { int n; cin >> n; vector > edges(2*n+2); for(int i=0; i> b >> c; edges[2*n].push_back(Edge(i, 100-b)); edges[i].push_back(Edge(n+i, 100)); edges[n+i].push_back(Edge(2*n+1, 100-c)); } int m; cin >> m; for(int i=0; i> d >> e; edges[n+e].push_back(Edge(d, INF)); } int ret = 100 * n - maxFlow(edges, 2*n, 2*n+1); cout << ret << endl; return 0; }