Cod sursa(job #2356962)

Utilizator Horea_Mihai_SilaghiHorea Mihai Silaghi Horea_Mihai_Silaghi Data 27 februarie 2019 00:56:45
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.57 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define inf 2000000
using namespace std;

ifstream cin("ninjago.in");
ofstream cout("ninjago.out");
vector <int> v[31205];
int viz[31205],n,m,c[31205],cost[31205]={0};
int cerinta;
struct euri
{
    int vf1,vf2,val,cst;
}e[31205];
bool cmp(euri i, euri j)
{
    if(i.val==j.val)
        return i.cst<j.cst;
    return (i.val<j.val);
}
bool cmp2(int i, int j)
{
    return cost[i]<cost[j];
}
int findd(int i)
{
    int y,r=i;
    while(viz[r]!=r)
        r=viz[r];
    while(i!=viz[i])
    {
        y=viz[i];
        viz[i]=r;
        i=y;
    }
    return r;
}
void bfs(int i,int cont)
{
    int st=1,dr=1,l,j;
    viz[i]=cont;
    c[st]=i;
    while(st<=dr)
    {
        l=v[c[st]].size();
        for(j=0;j<l;j++)
            if(viz[v[c[st]][j]]==0)
        {
            viz[v[c[st]][j]]=cont;
            dr++;
            c[dr]=v[c[st]][j];
        }
        st++;
    }
}

void rez_1()
{
    int i,j,x,y,cnt=1;
    char car;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        int ok=1;
        cin>>x>>y;
        for(j=1;j<=4;j++)
        {
            cin>>car;
            if(car=='E')
            {
               ok=0;
            }
        }
        if(ok)
        {
            v[x].push_back(y);
            v[y].push_back(x);
        }
    }
    bfs(1,1);
    for(j=2;j<=n;j++)
    {
        if(viz[j]!=0)
            cnt++;
    }
    cout<<cnt;
}
void reunire(int i, int j)
{
    viz[findd(i)]=findd(j);
}
void rez_2()
{
    int i,j,x,y,cnt=1,ok[31205],nr=0,vale,s=0;
    char car;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        vale=0;
        cin>>x>>y;
        for(j=1;j<=4;j++)
        {
            cin>>car;
            if(car=='E')
            {
               vale++;
            }
        }
        if(vale==0)
        {
            v[x].push_back(y);
            v[y].push_back(x);
        }
        else
        {
            nr++;
            e[nr].vf1=x;
            e[nr].vf2=y;
            e[nr].val=vale;
        }
    }
    viz[1]=1;
    bfs(1,1);
    for(j=1;j<=n;j++)
    {
        if(viz[j]==0)
        {
            viz[j]=j;
            cnt++;
            bfs(j,j);
        }
        ok[j]=inf;
    }
    cout<<cnt-1<<endl;
    sort(e+1,e+nr+1,cmp);
    //for(i=1;i<=nr;i++)
    //    cout<<e[i].vf1<<" "<<e[i].vf2<<" "<<e[i].val<<endl;
    for(i=1;i<=nr;i++)
    {
        if(findd(e[i].vf1)!=findd(e[i].vf2))
        {
            reunire(e[i].vf1,e[i].vf2);
            s+=e[i].val;
        }
    }
    cout<<s;
}
void rez_3()
{
    int i,j,val1,val2,val3,cnt=1,nr=0,vale,s=0,x[31205],y[31205],lng=0,ins[31205];
    unsigned long long ans=0;
    char car;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        vale=0;
        cin>>val1>>val2;
        val3=0;
        for(j=1;j<=4;j++)
        {
            int prod;
            if(j==1)
                prod=1;
            if(j==2)
                prod=5;
            if(j==3)
                prod=25;
            if(j==4)
                prod=125;
            cin>>car;
            if(car=='E')
            {
               vale++;
            }
            if(car=='D')
                val3+=4*prod;
            if(car=='C')
                val3+=3*prod;
            if(car=='B')
                val3+=2*prod;
            if(car=='A')
                val3+=prod;
        }
        if(vale==0)
        {
            lng++;
            x[lng]=val1;
            y[lng]=val2;
            cost[lng]=val3;
            ins[lng]=lng;
        }
        else
        {
            nr++;
            e[nr].vf1=val1;
            e[nr].vf2=val2;
            e[nr].val=vale;
            e[nr].cst=val3;
        }
    }
    for(i=1;i<=n;i++)
        viz[i]=i;
    sort(ins+1,ins+1+lng,cmp2);
    for(i=1;i<=lng;i++)
    {
        if(findd(x[ins[i]])!=findd(y[ins[i]]))
        {
            cout<<x[ins[i]]<<" "<<y[ins[i]]<<" "<<cost[ins[i]]<<endl;
            reunire(x[ins[i]],y[ins[i]]);
            ans+=cost[ins[i]];
        }
    }
    sort(e+1,e+nr+1,cmp);
    for(i=1;i<=nr;i++)
    {
        if(findd(e[i].vf1)!=findd(e[i].vf2))
        {
            cout<<e[i].vf1<<" "<<e[i].vf2<<" "<<e[i].cst<<endl;
            reunire(e[i].vf1,e[i].vf2);
            ans+=e[i].cst;
        }
    }
    cout<<ans;
}
int main()
{
    cin>>cerinta;
    if(cerinta==1)
    {
        rez_1();
        return 0;
    }
    if(cerinta==2)
    {
        rez_2();
        return 0;
    }
    rez_3();
    return 0;
}