Cod sursa(job #2562870)

Utilizator andreitudorpAndrei Tudor Popescu andreitudorp Data 29 februarie 2020 19:05:20
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

using namespace std;

ifstream cin("apm.in");
ofstream cout("apm.out");

#define MAXN 200005
int n, c, m;
int muchii;
int viz[MAXN];

struct nodes{
    int x;
    int y;
    int cost;
} v[MAXN];

struct anss{
    int x;
    int y;
    int cost;
} ans[MAXN];

void kruskal()
{int i,j,k;
    i=1;
    for(k=1;k<=n-1;k++)
    {while(viz[v[i].x]==viz[v[i].y]&&viz[v[i].x]!=0)
            i++;
        c+=v[i].cost;
        ans[i].x = v[i].x;
        ans[i].y = v[i].y;
        muchii++;
        if(viz[v[i].x]+viz[v[i].y]==0)
            viz[v[i].x]=viz[v[i].y]=v[i].x;
        else
        if(viz[v[i].x]*viz[v[i].y]==0)
            viz[v[i].x]=viz[v[i].y]=viz[v[i].x]+viz[v[i].y];
        else
        {for(j=1;j<=n;j++)
                if(viz[j]==viz[v[i].x]&&j!=v[i].x)
                    viz[j]=viz[v[i].y];
            viz[v[i].x]=viz[v[i].y];
        }
        i++;
    }
    cout << c << "\n";
}

int main() {

    cin >> n >> m;

    int x, y, z;

    for(int i = 1; i <= m; i++)
    {
        cin >> x >> y >> z;
        v[x].x = x;
        v[x].y = y;
        v[x].cost = z;
        v[y].x = x;
        v[y].y = y;
        v[y].cost = z;
    }

    kruskal();

    cout << muchii << "\n";

    for(int k=1;k<=n-1;k++)
    {
        if(ans[k].x != 0 && ans[k].y != 0)
        cout << ans[k].x << " " <<ans[k].y << "\n";
    }

    return 0;
}