Pagini recente » Cod sursa (job #3001900) | Cod sursa (job #1139597) | Cod sursa (job #2566783) | Cod sursa (job #512167) | Cod sursa (job #7283)
Cod sursa(job #7283)
#include <cstdio>
#include <vector>
#include <algorithm>
#define Nmax 15010
#define Mmax 30010
#define pb push_back
#define sz(a) int((a).size())
#define nd first
#define cst second
using namespace std;
int n, m, k, i, j, st, dr, mij, ct, a, b, c;
int viz[Nmax];
vector< pair<int,int> > lv[Nmax];
int cs[Nmax],cd[Nmax],sol[Nmax];
int x[Nmax], y[Nmax];
int cost[Mmax];
void citire()
{
scanf("%d %d %d\n", &n, &m, &k);
for (i=1; i<=m; ++i)
{
scanf("%d %d %d\n", &a, &b, &c);
lv[a].pb(make_pair(b,c));
lv[b].pb(make_pair(a,c));
cost[i] = c;
}
for (i=1; i<=k; ++i)
scanf("%d %d\n", &x[i], &y[i]);
}
void df(int nod)
{
int i;
viz[nod] = ct;
for (i=0; i<sz(lv[nod]); ++i)
if (!(viz[lv[nod][i].nd]) && lv[nod][i].cst <= cost[mij])
df(lv[nod][i].nd);
}
void solve()
{
sort(cost+1, cost+m+1);
for (i=1; i<=k; ++i)
{
cs[i] = 1;
cd[i] = m;
}
for (i=1; i<=k; ++i)
{
st = cs[i];
dr = cd[i];
if (st == dr)
sol[i] = st;
else
{
while (st <= dr)
{
mij = (st + dr) >> 1;
memset(viz,0,sizeof(viz));
ct = 0;
for (j=1; j<=n; ++j)
if (!viz[j])
{
++ct;
df(j);
}
for (j=i; j<=k; ++j)
if (viz[x[j]] == viz[y[j]])
{
if (cd[j] >= mij)
{
cd[j] = mij - 1;
sol[j] = mij;
}
}
else
if (cs[j] <= mij)
cs[j] = mij + 1;
if (viz[x[i]] == viz[y[i]])
{
sol[i] = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
}
}
for (i=1; i<=k; ++i)
printf("%d\n", cost[sol[i]]);
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
citire();
solve();
return 0;
}