Pagini recente » Cod sursa (job #2202410) | Cod sursa (job #3161460) | Cod sursa (job #1950296) | Cod sursa (job #2524454) | Cod sursa (job #3142086)
#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';
}