Cod sursa(job #1083733)

Utilizator Crismaru_VladFII Crismaru Vlad Marian Crismaru_Vlad Data 16 ianuarie 2014 12:45:38
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <vector>

#define IN "prim.in"
#define OUT "prim.out"

#define NMAX 2000
#define INF 2000000000

using namespace std;

struct Muchie
{
    int y, cost;
};

vector <Muchie> G[NMAX];
int n, m, cmin[NMAX], p[NMAX], M[NMAX], start;

void citire();
void Prim(int);
void afisare();
int c_minim(int, int);

int main()
{
    citire();
    Prim(start);
    afisare();
    return 0;
}

void citire()
{
    Muchie A;
    int i, x, y, c;
    FILE * fin = freopen(IN, "r", stdin);
    scanf("%d%d%d", &n, &m, &start);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d", &x, &y, &c);
        A.y=x;
        A.cost=c;
        G[y].push_back(A);
        A.y=y;
        G[x].push_back(A);
    }
}

void Prim(int x)
{
    int i, j, minim, selectat, val;
    for(i=1;i<=n;++i)
    {
        if(i==x)
            continue;
        cmin[i]=c_minim(x, i);
        p[i]=x;
    }
    M[x]=1;
    for(i=1;i<=n-1;++i)
    {
        minim=INF;
        for(j=1;j<=n;++j)
        {
            if(!M[j]&&cmin[j]<minim)
            {
                minim=cmin[j];
                selectat=j;
            }
        }
        M[selectat]=1;
        for(j=1;j<=n;++j)
        {
            if(M[j]&&j!=selectat)
                continue;
            val=c_minim(selectat, j);
            if(val<cmin[j])
            {
                cmin[j]=val;
                p[j]=selectat;
            }
        }
    }
}

int c_minim(int x, int y)
{
    int c_min=INF, i;
    for(i=0;i<G[x].size();++i)
    {
        if(G[x][i].y==y)
            if(G[x][i].cost<c_min)
                c_min=G[x][i].cost;
    }
    return c_min;
}

void afisare()
{
    int i, cost=0;
    FILE * fout = freopen(OUT, "w", stdout);
    for(i=1;i<=n;++i)
    {
        if(i!=start)
            cost+=cmin[i];
    }
    printf("%d\n", cost);
    for(i=1;i<=n;++i)
    {
        if(i!=start)
            printf("%d %d\n", i, p[i]);
    }
}