Cod sursa(job #3142086)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 19 iulie 2023 01:43:04
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <algorithm>
#include <map>
#define nmx 30005
using namespace std;
map <int,int> mp[nmx];
map <int,int> :: iterator it;
long long rasp[nmx];
int sef[nmx];
struct str
{
    int a,b,cost;
};
str edge[nmx];
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 n,i,j,k,l,m,q,nr,x,a,b;
int main()
{
    ifstream f ("radiatie.in");
    ofstream g ("radiatie.out");
    f>>n>>m>>q;
    for(i=1; i<=m; i++)
        f>>edge[i].a>>edge[i].b>>edge[i].cost;
    for(i=1; i<=q; i++)
        for(j=1; j<=2; j++)
        {
            f>>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++)
        g<<rasp[i]<<'\n';
}