Cod sursa(job #1126099)

Utilizator StefansebiStefan Sebastian Stefansebi Data 26 februarie 2014 21:17:36
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
ifstream fin("apm2.in");
ofstream fout("apm2.out");
vector <pair <int, int> > v[10009];
int n, i, a, b, j, m, qn, viz[10009], c, cost[10009], com[100009];
queue <int> q;
struct muchie {
    int n1; int n2; int l; int luat;
};
muchie vm[100000];
int cmp (muchie m1, muchie m2) {
    return m1.l < m2.l;
};


void citire(){
    int i;
    fin >> n >> m >> qn;
    for (i = 1; i <= m; i++)
        fin >> vm[i].n1 >> vm[i].n2 >> vm[i].l;
}

void kruskal(){
    int i, j;
    sort(vm + 1, vm + m + 1, cmp);
   // for (i = 1; i <= m; i++)
    //    fout << vm[i].n1 << " " << vm[i].n2 << " " << vm[i].l << endl;
    for (i = 1; i <= n; i++)
        com[i] = i;
    int k = 1; i = 1;
    while (k < n) {
        if (com[vm[i].n1] != com[vm[i].n2]){
            k++;
            a = vm[i].n1; b = vm[i].n2; c = vm[i].l;
            //fout << a << " " << b << " " << c << " " << endl;
            v[a].push_back(make_pair(b, c));
            v[b].push_back(make_pair(a, c));
            int s1 = com[vm[i].n1];
            int s2 = com[vm[i].n2];
            for (j = 1; j <= n; j++)
                if (com[j] == s1)
                    com[j] = s2;
        }
        i++;
    }
}

void dfs(int nod){
    viz[nod] = 1; //fout << nod << " ";
    for (int j = 0; j < v[nod].size(); j++)
        if (viz[v[nod][j].first] == 0){
            cost[v[nod][j].first] = max(cost[nod], v[nod][j].second);
            dfs(v[nod][j].first);
        }
}

void bfs(int st){
    int j;
    for (j = 1; j <= n; j++)
        cost[j] = -1;
    cost[st] = 0; q.push(st);
    while (!q.empty()){
        int nod = q.front(); q.pop();
        for (j = 0; j < v[nod].size(); j++)
            if (cost[v[nod][j].first] == -1){
                cost[v[nod][j].first] = max(cost[nod], v[nod][j].second);
                q.push(v[nod][j].first);
            }
    }
   // fout << cost[b] - 1;
    //fout << '\n';
}

void rezolva(){
    int i;
    for (i = 1; i <= qn; i++){
        fin >> a >> b;
        for (int k = 1; k <= n; k++){
            cost[k] = 0; viz[k] = 0;
        }
        dfs(a);
        fout << cost[b] - 1 << '\n';
    }
}

int main(){
    citire();
    kruskal();
    rezolva();
}