Cod sursa(job #402740)

Utilizator cristiprgPrigoana Cristian cristiprg Data 24 februarie 2010 09:15:05
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <cstdio>
#include <set>
using namespace std;
#define DIM 15005
#define mp make_pair
const int INF = 1<<30;
struct nod
{
    int x, cost, uz;
    nod *next;
	nod()
	{
		uz = 0;
	}
};
set < pair<int, int> > S;
nod *G[DIM], *GP[DIM];
int n, m, k, vs[DIM], vd[DIM], Min = INF, v[DIM], t[DIM];

void addMuchie(int i, int j, int c, nod *G[])
{
    nod *p = new nod;
    p -> x = j;
    p -> cost = c;
    p -> next = G[i];
    G[i] = p;
	if (i == 1)	
		S.insert(mp(c, j));
	
}

void read()
{
    FILE *f = fopen("radiatie.in", "r");
    fscanf(f, "%d%d%d", &n, &m, &k);
    for (int x, y, c;m;--m)
    {
        fscanf(f, "%d%d%d", &x, &y, &c);
        addMuchie(x, y, c, G);
        addMuchie(y, x, c, G);
    }
    for (int i = 1; i <= k; ++i)
        fscanf(f, "%d%d", &vs[i], &vd[i]);

    fclose(f);
}

void DFS(int i, int d, int lmax)
{
    if (i == d)
    {
        if (lmax < Min)
            Min = lmax;
        return;
    }
    for (nod *p = GP[i]; p; p = p->next)
        if (!v[p->x])
        {
            if (p->cost > Min)  continue;
            v[p->x] = 1;
            DFS(p->x, d, (p->cost) < lmax ? lmax : (p->cost));
            v[p->x] = 0;
        }
}

FILE *f = fopen("radiatie.out", "w");

void curata()
{
    for (int i = 1; i <= n; ++i)
        v[i] = 0;
    fprintf (f, "%d\n", Min);
}

void solve()
{
    for (int i = 1; i <= k; ++i)
        DFS(vs[i], vd[i], -1), curata(), Min = INF;
}

void afis(nod *G[])
{
	for (int i = 1; i <= n; ++i)
	{
		printf ("%d:", i);
		for (nod *p = G[i]; p; p=p->next)
			printf ("%d ", p->x);
		printf("\n");
	}
}

void apm()
{
	int d[DIM];
	for (int i =  1; i <= n; ++i)
		d[i] = INF, t[i] = INF, v[i] = 0;
	
	d[1] = 0;t[1] = 0;
	S.insert(mp(0, 1));
	for (nod *p = G[1]; p; p=p->next)
		d[p->x] = p->cost, t[p->x] = 1, S.insert(mp(p->cost, p->x));
	
	for (int k = 1; k < n; ++k)
	{
		
		int i = S.begin()->second;
		
		S.erase(*S.begin());
		v[i] = 1;
		for (nod *p = G[i]; p ; p=p->next)
			if (d[p->x] > p->cost && !v[p->x])
				d[p->x] = p->cost, S.insert(mp(p->cost, p->x)), t[p->x] = i;
	}
	

	for (int i = 1; i <= n; ++i)	
		if (t[i] != 0)
			addMuchie(i, t[i], d[i], GP), addMuchie(t[i], i, d[i], GP), v[i] = 0;
//	afis(GP);
	
	
}

int main()
{
    read();
	apm();
    solve();
    fclose(f);
    return 0;
}