Pagini recente » Cod sursa (job #1763096) | Cod sursa (job #486119) | Cod sursa (job #1039949) | Cod sursa (job #1260067) | Cod sursa (job #177636)
Cod sursa(job #177636)
#include <fstream>
#include <vector>
#define MAXN 15001
#define MAXM 30001
#define INF -1
#define maxi(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
int n, m, cnt = 0;
int p[MAXN], h[MAXN];
int a[2*MAXM][15], e[2*MAXM], l[2*MAXM], lg[2*MAXM];
struct tata{
int x, c;
}t[MAXN], aux;
vector<vector<tata> > v;
struct muchie{
int v1, v2, c;
} g[MAXM];
struct Cmp{
bool operator () (muchie a, muchie b)
{
return (a.c < b.c);
}
};
int Find(int x)
{
if (x != p[x]) p[x] = Find(p[x]);
return p[x];
}
void Union(int x, int y)
{
if (h[x] > h[y]) p[y] = p[x];
else
{
p[x] = p[y];
if (h[x] == h[y]) h[y]++;
}
}
void DF(int nod, int lvl)
{
p[nod] = 1;
l[nod] = lvl;
int x = v[nod].size(), i;
for (i = 0; i < x; i++)
if (!p[v[nod][i].x])
{
t[v[nod][i].x].x = nod;
t[v[nod][i].x].c = v[nod][i].c;
DF(v[nod][i].x, lvl+1);
}
}
/*int GetCMax(int x, int lca)
{
int cmax = 0;
if (x == lca) return INF;
while(x != lca)
{
cmax = maxi(cmax, t[x].c);
x = t[x].x;
}
return cmax;
}*/
int GetCMax(int x, int y)
{
int rez = 0;
while (x != y)
{
if (l[x] > l[y])
{
rez = maxi(rez, t[x].c);
x = t[x].x;
}
else
{
rez = maxi(rez, t[y].c);
y = t[y].x;
}
}
return rez;
}
int RMQ(int x, int y)
{
int k = lg[y-x];
if (l[a[x][k]] < l[a[y-(1<<k)+1][k]]) return e[a[x][k]];
return e[a[y-(1<<k)+1][k]];
}
int main()
{
int i, j, x, x1, x2, cost, T;
ifstream fin("radiatie.in");
fin >> n >> m >> T;
v.resize(n+1);
for (i = 1; i <= m; i++)
{
fin >> x1 >> x2 >> cost;
g[i].v1 = x1;
g[i].v2 = x2;
g[i].c = cost;
}
sort(g+1, g+m+1, Cmp());
for (i = 1; i <= n; i++){ p[i] = i; h[i] = 0; }
for (i = 1; i <= m; i++)
{
x1 = Find(g[i].v1);
x2 = Find(g[i].v2);
if (x1 != x2)
{
aux.x = g[i].v2;
aux.c = g[i].c;
v[g[i].v1].push_back(aux);
aux.x = g[i].v1;
v[g[i].v2].push_back(aux);
Union(x1, x2);
}
}
for (i = 1; i <= n; i++){ p[i] = 0; h[i] = 0; }
DF(1, 1);
/* lg[1] = 0;
for (i = 2; i <= cnt; i++)
lg[i] = lg[i/2] + 1;
for (i = 1; i <= cnt; i++)
a[i][0] = i;
for (j = 1; (1 << j) <= cnt; j++)
for (i = 1; i + (1 << (j-1)) <= cnt; i++)
{
x = i + (1 << (j-1));
if (l[a[i][j-1]] < l[a[x][j-1]]) a[i][j] = a[i][j-1];
else a[i][j] = a[x][j-1];
}
*/
ofstream fout("radiatie.out");
int lca, max1;//, max2;
for (; T; T--)
{
fin >> x1 >> x2;
//if (h[x1] > h[x2]) swap(x1, x2);
// lca = RMQ(h[x1], h[x2]);
max1 = GetCMax(x1, x2);
// max2 = GetCMax(x2, lca);
fout << max1 << "\n";
}
fin.close();
fout.close();
return 0;
}