Cod sursa(job #480503)

Utilizator Addy.Adrian Draghici Addy. Data 28 august 2010 11:13:55
Problema Arbore partial de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cstring>

#define MAX 32
#define INF 1 << 30

struct muchie {
	int x, y;
};

muchie M[MAX];
int G[MAX][MAX], C[MAX][MAX], A[MAX][MAX], viz[MAX], used[MAX], Msol[MAX], n, m, N, cst, nr, msol, sol;

void citire (), DFS (int), back (int), afisare ();

int main () {
	
	citire ();
	
	back (1);
	
	afisare ();
	
	return 0;
}

void citire () {
	
	freopen ("apm.in", "r", stdin);
	
	int i, x, y, c;
	
	scanf ("%d %d", &n, &m);
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &c);
		G[x][y] = G[y][x] = 1, C[x][y] = c;
		M[i].x = x, M[i].y = y;
	}
	
	sol = INF;
}

void DFS (int nod) {
	
	int i;
	
	viz[nod] = 1, nr++;
	for (i = 1; i <= n; i++) {
		if (A[nod][i] && !viz[i])
			DFS (i);
	}
}

void back (int k) {
	
	int i;
	
	if (N > n - 1)
		return;
	
	if (k == m + 1) {
		if (cst >= sol || N != n - 1)
			return;
		
		nr = 0; memset (viz, 0, sizeof (viz));
		DFS (1);
		if (nr == n) {
			sol = cst;
			for (i = 1, msol = 0; i <= m; i++)
				if (used[i])
					Msol[++msol] = i;
		}
		
		return;
	}
	
	for (i = 0; i <= 1; i++) {
		
		if (i == 0)
			back (k + 1);
		
		if (i == 1) {
			N++;
			cst += C[ M[k].x ][ M[k].y ];
			A[ M[k].x ][ M[k].y ] = A[ M[k].y ][ M[k].x ] = 1, used[k] = 1;
			
			back (k + 1);
			
			N--;
			cst -= C[ M[k].x ][ M[k].y ];
			A[ M[k].x ][ M[k].y ] = A[ M[k].y ][ M[k].x ] = 0, used[k] = 0;
		}
	}
}

void afisare () {
	
	freopen ("apm.out", "w", stdout);

	int i;
	
	printf ("%d\n%d\n", sol, msol);
	
	for (i = 1; i <= msol; i++)
		printf ("%d %d\n", M[ Msol[i] ].x, M[ Msol[i] ].y);
}