Pagini recente » Cod sursa (job #1654578) | Cod sursa (job #2020615) | Cod sursa (job #1695508) | Cod sursa (job #2187852) | Cod sursa (job #1529097)
#include <fstream>
#include <vector>
#include <algorithm>
#define NMax 10100
using namespace std;
ifstream f("online.in");
ofstream g("online.out");
int nodes, nEdges, queries, disTree[NMax];
struct edge {
short int node1;
short int node2;
short int cost;
} edges[2*NMax];
bool cmp(const edge e1, const edge e2)
{
return e1.cost < e2.cost;
}
int findFather(int node)
{
while (disTree[node] > 0)
node = disTree[node];
return node;
}
int kruskal() {
int cost = 0;
sort(edges+1, edges+nEdges+1, cmp);
for (int i=1; i<=nodes; i++)
disTree[i] = -1;
nEdges = 0;
for (int i=1; nEdges < nodes - 1; i++) {
edge crtEdge = edges[i];
int fath1 = findFather(crtEdge.node1);
int fath2 = findFather(crtEdge.node2);
if (fath1 != fath2) {
if (-disTree[fath1] > -disTree[fath2]) {
disTree[fath1] += disTree[fath2];
disTree[fath2] = fath1;
int node = crtEdge.node2;
while (disTree[node] > 0) {
disTree[node] = fath1;
node = disTree[node];
}
}
else {
disTree[fath2] += disTree[fath1];
disTree[fath1] = fath2;
int node = crtEdge.node1;
while (disTree[node] > 0) {
disTree[node] = fath2;
node = disTree[node];
}
}
++nEdges;
edges[nEdges].node1 = crtEdge.node1;
edges[nEdges].node2 = crtEdge.node2;
edges[nEdges].cost = crtEdge.cost;
cost += crtEdge.cost;
}
}
return cost;
}
int main()
{
f>>nodes>>nEdges;
for (int i=1; i<=nEdges; i++)
f>>edges[i].node1>>edges[i].node2>>edges[i].cost;
g<<kruskal()<<"\n";
f>>queries;
edge newEdge;
for (int i=1; i<=queries; i++) {
f>>newEdge.node1>>newEdge.node2>>newEdge.cost;
edges[++nEdges] = newEdge;
g<<kruskal()<<"\n";
}
return 0;
}