#include<iostream> #include<vector> #include<list> #include<algorithm> #define LUINT std::list<unsigned int> #define VECUINT std::vector<unsigned int> #define PUII std::pair<unsigned int, unsigned int> #define pb push_back #define CI const_iterator #define ULL unsigned long long struct Element{ unsigned int x; unsigned int p; unsigned int s; LUINT sons; }; struct Zbiory{ std::vector<Element> wieszak; Zbiory(unsigned int n):wieszak(n){ for(unsigned int i=0;i<n;++i) wieszak[i].x=wieszak[i].p=i,wieszak[i].s=0; } unsigned int Find(unsigned int x){ if(wieszak[x].p!=x) wieszak[x].p=Find(wieszak[x].p); return wieszak[x].p; } unsigned int Union(unsigned int a, unsigned int b){ a=Find(a),b=Find(b); if(wieszak[a].s<wieszak[b].s) wieszak[a].p=b,wieszak[b].sons.pb(a); else wieszak[b].p=a,wieszak[a].sons.pb(b); if(wieszak[a].s==wieszak[b].s) wieszak[a].s++; return Find(a); } LUINT Traverse(unsigned int x){ LUINT R; Traverse_DFS(x,R); return R; } void Traverse_DFS(unsigned int x, LUINT & R){ R.pb(x); for(LUINT::CI iE=wieszak[x].sons.begin();iE!=wieszak[x].sons.end();++iE) Traverse_DFS(*iE,R); } }; int main(){ std::ios_base::sync_with_stdio(false); unsigned int n,m,k; std::cin>>n>>m>>k; VECUINT Wagi(n); std::vector<PUII> Sekwencja(m), Reakcje(2*k); std::vector<LUINT> Spis(n); for(unsigned int i=0;i<n;++i) std::cin>>Wagi[i]; for(unsigned int i=0;i<m;--Sekwencja[i].first,--Sekwencja[i].second,++i) std::cin>>Sekwencja[i].first>>Sekwencja[i].second; for(unsigned int i=0;i<2*k;i+=2){ std::cin>>Reakcje[i].first>>Reakcje[i].second; Reakcje[i+1].first=--Reakcje[i].second; Reakcje[i+1].second=--Reakcje[i].first; Spis[Reakcje[i].first].pb(i); Spis[Reakcje[i+1].first].pb(i+1); } Zbiory Fiolki(n); ULL R=0; for(unsigned int i=0;i<m;++i){ Sekwencja[i].first=Fiolki.Find(Sekwencja[i].first); Sekwencja[i].second=Fiolki.Find(Sekwencja[i].second); if(Fiolki.wieszak[Sekwencja[i].second].s<Fiolki.wieszak[Sekwencja[i].first].s) std::swap(Sekwencja[i].first,Sekwencja[i].second); LUINT Zrodla=Fiolki.Traverse(Sekwencja[i].first); VECUINT Kolejka; for(LUINT::CI iE=Zrodla.begin();iE!=Zrodla.end();++iE) Kolejka.insert(Kolejka.end(),Spis[*iE].begin(),Spis[*iE].end()); std::sort(Kolejka.begin(),Kolejka.end()); for(unsigned int j=0;j<Kolejka.size();++j) if(Fiolki.Find(Reakcje[Kolejka[j]].second)==Sekwencja[i].second){ unsigned int l=std::min(Wagi[Reakcje[Kolejka[j]].first],Wagi[Reakcje[Kolejka[j]].second]); Wagi[Reakcje[Kolejka[j]].first]-=l; Wagi[Reakcje[Kolejka[j]].second]-=l; R+=2*l; } Fiolki.Union(Sekwencja[i].first,Sekwencja[i].second); } std::cout<<R<<"\n"; return 0; }
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include<iostream> #include<vector> #include<list> #include<algorithm> #define LUINT std::list<unsigned int> #define VECUINT std::vector<unsigned int> #define PUII std::pair<unsigned int, unsigned int> #define pb push_back #define CI const_iterator #define ULL unsigned long long struct Element{ unsigned int x; unsigned int p; unsigned int s; LUINT sons; }; struct Zbiory{ std::vector<Element> wieszak; Zbiory(unsigned int n):wieszak(n){ for(unsigned int i=0;i<n;++i) wieszak[i].x=wieszak[i].p=i,wieszak[i].s=0; } unsigned int Find(unsigned int x){ if(wieszak[x].p!=x) wieszak[x].p=Find(wieszak[x].p); return wieszak[x].p; } unsigned int Union(unsigned int a, unsigned int b){ a=Find(a),b=Find(b); if(wieszak[a].s<wieszak[b].s) wieszak[a].p=b,wieszak[b].sons.pb(a); else wieszak[b].p=a,wieszak[a].sons.pb(b); if(wieszak[a].s==wieszak[b].s) wieszak[a].s++; return Find(a); } LUINT Traverse(unsigned int x){ LUINT R; Traverse_DFS(x,R); return R; } void Traverse_DFS(unsigned int x, LUINT & R){ R.pb(x); for(LUINT::CI iE=wieszak[x].sons.begin();iE!=wieszak[x].sons.end();++iE) Traverse_DFS(*iE,R); } }; int main(){ std::ios_base::sync_with_stdio(false); unsigned int n,m,k; std::cin>>n>>m>>k; VECUINT Wagi(n); std::vector<PUII> Sekwencja(m), Reakcje(2*k); std::vector<LUINT> Spis(n); for(unsigned int i=0;i<n;++i) std::cin>>Wagi[i]; for(unsigned int i=0;i<m;--Sekwencja[i].first,--Sekwencja[i].second,++i) std::cin>>Sekwencja[i].first>>Sekwencja[i].second; for(unsigned int i=0;i<2*k;i+=2){ std::cin>>Reakcje[i].first>>Reakcje[i].second; Reakcje[i+1].first=--Reakcje[i].second; Reakcje[i+1].second=--Reakcje[i].first; Spis[Reakcje[i].first].pb(i); Spis[Reakcje[i+1].first].pb(i+1); } Zbiory Fiolki(n); ULL R=0; for(unsigned int i=0;i<m;++i){ Sekwencja[i].first=Fiolki.Find(Sekwencja[i].first); Sekwencja[i].second=Fiolki.Find(Sekwencja[i].second); if(Fiolki.wieszak[Sekwencja[i].second].s<Fiolki.wieszak[Sekwencja[i].first].s) std::swap(Sekwencja[i].first,Sekwencja[i].second); LUINT Zrodla=Fiolki.Traverse(Sekwencja[i].first); VECUINT Kolejka; for(LUINT::CI iE=Zrodla.begin();iE!=Zrodla.end();++iE) Kolejka.insert(Kolejka.end(),Spis[*iE].begin(),Spis[*iE].end()); std::sort(Kolejka.begin(),Kolejka.end()); for(unsigned int j=0;j<Kolejka.size();++j) if(Fiolki.Find(Reakcje[Kolejka[j]].second)==Sekwencja[i].second){ unsigned int l=std::min(Wagi[Reakcje[Kolejka[j]].first],Wagi[Reakcje[Kolejka[j]].second]); Wagi[Reakcje[Kolejka[j]].first]-=l; Wagi[Reakcje[Kolejka[j]].second]-=l; R+=2*l; } Fiolki.Union(Sekwencja[i].first,Sekwencja[i].second); } std::cout<<R<<"\n"; return 0; } |