#include <stdio.h> #include <vector> #include <set> #include <algorithm> #define MAXN 200001 using namespace std; std::vector<int> fi; std::vector<int> redirect; std::vector<int> registers[MAXN]; std::vector<pair<int,int> > seq; std::vector<pair<int,int> > reactions; typedef long long int lli; static lli addfs(int n1,int n2) { lli result=0; if (registers[n1].size() != 0 ) { std::vector<int> inter; std::vector<int> merged; std::vector<int>::iterator it; std::set_intersection( registers[n1].begin(), registers[n1].end(), registers[n2].begin(), registers[n2].end(), std::back_inserter( inter ) ); merged.resize(registers[n1].size() + registers[n2].size()); it = std::set_symmetric_difference(registers[n1].begin(), registers[n1].end(), registers[n2].begin(), registers[n2].end(), merged.begin()); merged.resize(it - merged.begin()); registers[n2] = merged; for (int i=0;i<inter.size();i++) { int f1 = reactions[inter[i]].first; int f2 = reactions[inter[i]].second; int val = fi[f1]<fi[f2]?fi[f1]:fi[f2]; fi[f1] -= val; fi[f2] -= val; result += val*2; // registers[n2].erase(inter[i]); } } return result; } int main(int argc,char *argv[]) { int n,m,k; lli result = 0; scanf("%d %d %d",&n,&m,&k); fi.resize(n+1); for (int i=1;i<=n;i++) { int val; scanf("%d",&val); fi[i] = val; } seq.resize(m); for (int i=0;i<m;i++) { int f1,f2; scanf("%d %d",&f1,&f2); seq[i] = pair<int,int>(f1,f2); } for (int i=0;i<k;i++) { int s1,s2; scanf("%d %d",&s1,&s2); registers[s1].push_back(i); registers[s2].push_back(i); reactions.push_back(pair<int,int>(s1,s2)); } for (int i=0;i<m;i++) { result += addfs(seq[i].first,seq[i].second); } printf("%lld\n",result); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <stdio.h> #include <vector> #include <set> #include <algorithm> #define MAXN 200001 using namespace std; std::vector<int> fi; std::vector<int> redirect; std::vector<int> registers[MAXN]; std::vector<pair<int,int> > seq; std::vector<pair<int,int> > reactions; typedef long long int lli; static lli addfs(int n1,int n2) { lli result=0; if (registers[n1].size() != 0 ) { std::vector<int> inter; std::vector<int> merged; std::vector<int>::iterator it; std::set_intersection( registers[n1].begin(), registers[n1].end(), registers[n2].begin(), registers[n2].end(), std::back_inserter( inter ) ); merged.resize(registers[n1].size() + registers[n2].size()); it = std::set_symmetric_difference(registers[n1].begin(), registers[n1].end(), registers[n2].begin(), registers[n2].end(), merged.begin()); merged.resize(it - merged.begin()); registers[n2] = merged; for (int i=0;i<inter.size();i++) { int f1 = reactions[inter[i]].first; int f2 = reactions[inter[i]].second; int val = fi[f1]<fi[f2]?fi[f1]:fi[f2]; fi[f1] -= val; fi[f2] -= val; result += val*2; // registers[n2].erase(inter[i]); } } return result; } int main(int argc,char *argv[]) { int n,m,k; lli result = 0; scanf("%d %d %d",&n,&m,&k); fi.resize(n+1); for (int i=1;i<=n;i++) { int val; scanf("%d",&val); fi[i] = val; } seq.resize(m); for (int i=0;i<m;i++) { int f1,f2; scanf("%d %d",&f1,&f2); seq[i] = pair<int,int>(f1,f2); } for (int i=0;i<k;i++) { int s1,s2; scanf("%d %d",&s1,&s2); registers[s1].push_back(i); registers[s2].push_back(i); reactions.push_back(pair<int,int>(s1,s2)); } for (int i=0;i<m;i++) { result += addfs(seq[i].first,seq[i].second); } printf("%lld\n",result); } |