Cod sursa(job #971560)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 9 iulie 2013 16:46:15
Problema Arbore partial de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
using namespace std;

#define NMAX 200001
#define MMAX 400001

struct muchie {
	int x,y,cost;
	muchie (int _x, int _y, int _cost) {
		x=_x;
		y=_y;
		cost=_cost;
	}
};

vector <muchie> v[NMAX],T[NMAX],e;
int viz[NMAX],c[NMAX],p[NMAX];

void builtT(int nod)
{
	viz[nod]=1;
	for(vector <muchie> :: iterator it=v[nod].begin();it!=v[nod].end();it++) 
		if(viz[it->y]==0) {
			T[nod].push_back(muchie(it->x,it->y,it->cost));
			T[it->y].push_back(muchie(it->y,it->x,it->cost));
			builtT(it->y);
		}
}

void sterge(int x, int y)
{
	for(vector <muchie> :: iterator it=T[x].begin();it!=T[x].end();it++)
		if(it->y==y) {
			T[x].erase(it);
			return ;
		}
}

int cauta(int x, int y)
{
	for(vector <muchie> :: iterator it=T[x].begin();it!=T[x].end();it++)
		if(it->y==y) 
			return 1;
	return 0;
}
int add_edge(int nr)
{
	int u,vv,cost,x,y,max,st,dr,nod;
	u=e[nr].x;
	vv=e[nr].y;
	cost=e[nr].cost;
	memset(viz,0,sizeof(viz));
	memset(p,0,sizeof(p));
	st=1;
	dr=1;
	c[st]=u;
	viz[u]=1;
	while(st<=dr) {
		nod=c[st];
		st++;
		if(viz[vv]==1)
			break;
		for(vector <muchie> :: iterator it=T[nod].begin();it!=T[nod].end();it++)
			if(viz[it->y]==0) {
				c[++dr]=it->y;
				viz[it->y]=1;
				p[it->y]=nod;
				if(it->y==vv)
					break;
			}
	}
	max=-(1<<30);
	for(nod=vv;nod!=0;nod=p[nod]) 
		for(vector <muchie> :: iterator it=T[nod].begin();it!=T[nod].end();it++) {
			if(it->y==p[nod]) {
				if(it->cost>max) {
					max=it->cost;
					x=nod;
					y=p[nod];
				}
				break;
			}
		}
	if(max<=cost)
		return 0;
	e[nr].x=x;
	e[nr].y=y;
	e[nr].cost=max;
	sterge(x,y);
	sterge(y,x);
	T[u].push_back(muchie(u,vv,cost));
	T[vv].push_back(muchie(vv,u,cost));
	return 1;
}

int main ()
{
	int n,m,x,y,cost,i,cmin;
	ifstream f("apm.in");
	ofstream g("apm.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>y>>cost;
		v[x].push_back(muchie(x,y,cost));
		v[y].push_back(muchie(y,x,cost));
	}
	f.close();
	builtT(1);
	for(i=1;i<=n;i++)
		for(vector <muchie> :: iterator it=v[i].begin();it!=v[i].end();it++)
			if(cauta(i,it->y)==0 && i<it->y) 
				e.push_back(muchie(i,it->y,it->cost));
	m=e.size()-1;
	for(i=0;i<=m;i++) 
		if(add_edge(i)==1)
			i=-1;
	cmin=0;
	for(i=1;i<=n;i++)
		for(vector <muchie> :: iterator it=T[i].begin();it!=T[i].end();it++)
			if(i<it->y)
				cmin=cmin+it->cost;
	g<<cmin<<'\n'<<n-1<<'\n';
	for(i=1;i<=n;i++)
		for(vector <muchie> :: iterator it=T[i].begin();it!=T[i].end();it++)
			if(i<it->y)
				g<<i<<" "<<it->y<<'\n';
	g.close();
	return 0;
}