Cod sursa(job #2162225)

Utilizator SkyConectorOvidiu Sonea SkyConector Data 12 martie 2018 09:15:31
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define mp make_pair
#define pb push_back
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
vector <pair<int , pair<int ,int> > >v;
vector <pair<int,int> > w[15002];
vector <pair<pair<int,int> ,pair<int,int> > >noduri;
int n,m,k,p[15002],s,maxi,cont,cont2;
bool wayToSort(pair<pair<int,int> ,pair<int,int> > i,pair<pair<int,int> ,pair<int,int> > j)
{
    return( i.first.first*100000+i.first.second<j.first.first*100000+j.first.second);
}
bool secondWayToSort(pair<pair<int,int> ,pair<int,int> > i,pair<pair<int,int> ,pair<int,int> > j)
{
    return(i.second.second<j.second.second);
}
void citire()
{
    fin>>n>>m>>k;
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        //w[a].pb(mp(b,c));
        //w[b].pb(mp(a,c));
        v.pb(mp(c,mp(a,b)));
    }
    for(int i=0;i<k;i++)
    {
        int a,b;
        fin>>a>>b;
        if(a<b)
            noduri.pb(mp(mp(a,b),mp(0,i)));
        else
            noduri.pb(mp(mp(b,a),mp(0,i)));
    }
}
int findx(int x){
    if(p[x]<0)
        return x;
    else
        return x=findx(p[x]);

}
void unionx(int a,int b )
{
    int parenta=findx(a);
    int parentb=findx(b);
    if(p[parenta]>p[parentb])
        p[parenta]=parentb;
    else if(p[parenta]<p[parentb])
        p[parentb]=parenta;
    else{
        p[parenta]=parentb;
        p[parentb]--;
    }
}
void APM()
{
    int t=0;
    sort(v.begin(),v.end());
    for(int i=1;i<=n;i++)
        p[i]=-1;
    for(int i=0;i<m;i++)
    {
        int x=findx(v[i].second.first);
        int y=findx(v[i].second.second);
        if(x!=y)
        {
            s+=v[i].first;
            unionx(v[i].second.first,v[i].second.second);
            w[v[i].second.first].pb(mp(v[i].second.second,v[i].first));
            w[v[i].second.second].pb(mp(v[i].second.first,v[i].first));
            t++;
            t++;
        }
        if(t/2==n-1)
            break;
    }
}
void DFS(int nod,int maxx,int start)
{
    p[nod]=1;
    for(int i=1;i<=n;i++)
    {
        int ok=0;
        for(int j=0;j<w[nod].size();j++)
            if(w[nod][j].first==i)
                ok=w[nod][j].second;
        if(p[i]==0 && ok!=0)
        {
            if(maxx>ok)
                ok=maxx;
            for(int j=cont2;j<cont2+cont;j++)
                if(noduri[j].first.first==start && noduri[j].first.second==i)
                    noduri[j].second.first=ok;
            DFS(i,ok,start);
        }
    }
}
void calcDist()
{
    sort(noduri.begin(),noduri.end(),wayToSort);
    for(int j=0;j<k;j++)
    {
        maxi=noduri[j].first.first;
        cont2=j;
        cont=0;
        while(j<k && noduri[j].first.first==maxi)
        {
            j++;
            cont++;
        }
        j--;
        for(int i=1;i<=n;i++)
            p[i]=0;
        //cout<<maxi<<endl;
        DFS(maxi,0,maxi);
    }
    sort(noduri.begin(),noduri.end(),secondWayToSort);
}
void afisare()
{
    for(int i=0;i<k;i++)
    {
        fout<<noduri[i].second.first<<endl;
    }
}
int main()
{
    citire();
    APM();
    calcDist();
    afisare();
    return 0;
}