Pagini recente » Istoria paginii runda/tamasforthewin/clasament | Cod sursa (job #1432643) | Cod sursa (job #1684734) | Cod sursa (job #307436) | Cod sursa (job #1684673)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
typedef struct
{
int v1,v2,cost;
} wEdge;
istream& operator >>(istream& i, wEdge& e)
{
i>>e.v1>>e.v2>>e.cost;
e.v1--;
e.v2--;
return i;
}
ostream& operator <<(ostream& o, wEdge& e)
{
o<<e.v1+1<<' '<<e.v2+1;
return o;
}
bool operator <(const wEdge& e1, const wEdge& e2)
{
if(e1.cost<e2.cost) return 1;
return 0;
}
bool operator ==(const wEdge& e1, const wEdge& e2)
{
if(e1.cost==e2.cost) return 1;
return 0;
}
int vertexRank(const int& v, const vector<int>& parent)
{
int rank=0;
for(unsigned int i=0;i<parent.size();i++)
{
if(parent[i]==v) rank++;
}
return rank;
}
void Union(const int& v1, const int& v2, vector<int>& parent)
{
if(vertexRank(v1,parent)>vertexRank(v2,parent))
{
for(unsigned int i=0;i<parent.size();i++)
{
if(parent[i]==parent[v2] && i!=v2) parent[i]=parent[v1];
}
parent[v2]=parent[v1];
}
else
{
for(unsigned int i=0;i<parent.size();i++)
{
if(parent[i]==parent[v1] && i!=v1) parent[i]=parent[v2];
}
parent[v1]=parent[v2];
}
}
int main()
{
ifstream fin("apm.in");
int N,M,i,j,costTotal=0,m=0;
wEdge aux;
vector<wEdge> graph;
vector<wEdge> kruskal;
vector<int> parent;
fin>>N>>M;
graph.resize(M);
parent.resize(M,0);
for(i=0;i<M;i++) fin>>graph[i];
for(i=0;i<N;i++) parent[i]=i;
fin.close();
for(i=0;i<M-1;i++)
{
if(graph[i+1]<graph[i])
{
aux=graph[i];
graph[i]=graph[i+1];
graph[i+1]=aux;
if(i>0) i-=2;
}
}
for(i=0;i<M;i++)
{
//cout<<"Checking the edge "<<graph[i].v1+1<<'-'<<graph[i].v2+1<<" of cost "<<graph[i].cost<<". ";
if(parent[graph[i].v1]!=parent[graph[i].v2])
{
//cout<<"Parent of "<<graph[i].v1+1<<" is "<<parent[graph[i].v1]<<" and parent of "<<graph[i].v2<<" is "<<parent[graph[i].v2]<<".\n";
kruskal.push_back(graph[i]);
Union(graph[i].v1,graph[i].v2,parent);
m++;
costTotal+=graph[i].cost;
}
}
ofstream fout("apm.out");
fout<<costTotal<<'\n'<<m<<'\n';
for(i=0;i<kruskal.size();i++) fout<<kruskal[i]<<'\n';
fout.close();
return 0;
}