Cod sursa(job #3005083)

Utilizator popescuadrianpopescuadrian popescuadrian Data 16 martie 2023 19:14:10
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <algorithm>
#include <map>

using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
map<int,int>mp[30005];
map<int,int>::iterator it;
long long rasp[30005];
int sef[30006];
struct str
{
    int a,b,cost;
};
str edge[30005];
bool cmp(str a,str b)
{
    return a.cost<b.cost;
}
int find(int u)
{
    if(u==sef[u])
    {
        return u;
    }
    return sef[u]=find(sef[u]);
}
void merge(int a,int b,int val)
{
    int q,nr;
    if(mp[a].size()<mp[b].size())
    {
        swap(a,b);
    }
    for(it=mp[b].begin();it!=mp[b].end();it++)
    {
        q=it->first;
        nr=it->second;
        if(mp[a][q]==0)
        {
            mp[a][q]=1;
        }
        else
        {
            rasp[q]=rasp[q]+nr*mp[a][q]*val;
        }
    }
    sef[b]=a;
}
int main()
{
    int n,i,j,k,l,m,q,nr,x,a,b;
    cin>>n>>m>>q;
    for(i=1;i<=m;i++)
    {
        cin>>edge[i].a>>edge[i].b>>edge[i].cost;
    }
    for(i=1;i<=q;i++)
    {
        for(j=1;j<=2;j++)
        {
            cin>>x;
            mp[x][i]++;
        }
    }
    sort(edge+1,edge+m+1,cmp);
    for(i=1;i<=n;i++)
    {
        sef[i]=i;
    }
    for(i=1;i<=m;i++)
    {
        a=edge[i].a;
        b=edge[i].b;
        a=find(a);
        b=find(b);
        if(a!=b)
        {
            merge(a,b,edge[i].cost);
        }
    }
    for(i=1;i<=q;i++)
    {
        cout<<rasp[i]<<'\n';
    }
    return 0;
}