Pagini recente »
Borderou de evaluare (job #212902)
|
Borderou de evaluare (job #620199)
|
Borderou de evaluare (job #750548)
|
Clasament cex_cnilc1_s1
|
Cod sursă (job #718687)
Cod sursă (job
#718687)
#include <bits/stdc++.h>
using ll=long long;
#define S second
#define F first
#define endl '\n'
#define spid ios_base::sync_with_stdio(false);cin.tie(NULL);
const int mod=1e9+7;
const double pi=3.14159265359;
const int maxn=10001;
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
};
int t=1,n,m,k;
int parent[maxn],rang[maxn];
vector<pair<int,pair<int,int>>> A,B;
//DSU~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int find(int i){
if(parent[i]==i)return i;
return parent[i]=find(parent[i]);
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
if (rang[a] < rang[b])
swap(a, b);
parent[b] = a;
if (rang[a] == rang[b])
rang[a]++;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int createMST(){
int ans=0;
for(auto it:A){
int a=it.S.F,b=it.S.S;
int val=it.F;
if(find(a)==find(b))continue;
unite(a,b);
B.push_back({val,{a,b}});
ans+=val;
}
return ans;
}
int main(){
spid;
InParser fin("zapada.in");
//ifstream fin("grader_test10.in");
ofstream cout("zapada.out");
fin>>n>>m>>k;
for(int i=0;i<m;i++){
int c1,c2,c3;
fin>>c1>>c2>>c3;
A.push_back({c3,{c1-1,c2-1}});
}
for(int i=0;i<n;i++){
parent[i]=i;
rang[i]=1;
}
sort(A.begin(),A.end());
int ans;
ans=createMST();
cout<<ans<<endl;
A.clear();
A=B;
while(k--){
int c1,c2,c3;
fin>>c1>>c2>>c3;
vector<pair<int,pair<int,int>>>::iterator j;
j=A.end();
j--;
if(A.begin()->F>c3){
j=A.begin();
}
while(j!=A.begin()&&j->F>c3){
j--;
}
if(j+1!=A.end()){
for(int i=0;i<n;i++){
parent[i]=i;
rang[i]=1;
}
A.insert(j+1,{c3,{c1-1,c2-1}});
B.clear();
ans=createMST();
}
A.clear();
A=B;
cout<<ans<<endl;
}
}