Pagini recente » Cod sursa (job #1491034) | Cod sursa (job #1203885) | Cod sursa (job #1925914) | Cod sursa (job #2835192) | Cod sursa (job #1235741)
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 15005
#define MMAX 30005
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct Element{
int x;
int y;
int c;
};
Element Array[MMAX];
int N,M,Solution[MMAX],K;
int R[NMAX],TT[NMAX],Result,Number,F[NMAX];
bool V[MMAX];
bool Use[NMAX];
int Level[NMAX];
vector <int> G[NMAX];
vector <int> Cost[NMAX];
int C[NMAX];
bool compare(Element a,Element b)
{
return a.c<b.c;
}
void Read()
{
f>>N>>M>>K;
int i;
for(i=1;i<=M;i++)
f>>Array[i].x>>Array[i].y>>Array[i].c;
sort(Array+1,Array+M+1,compare);
}
int Father(int x)
{
while(TT[x]!=x)
x=TT[x];
while(TT[x]!=x)
{
int y=TT[x];
TT[x]=x;
x=y;
}
return x;
}
void DFS(int node)
{
Use[node]=1;
for(int i=0;i<G[node].size();i++)
{
int neighbour=G[node][i],cost=Cost[node][i];
if(Use[neighbour]==0)
{
Level[neighbour]=Level[node]+1;
C[neighbour]=cost;
F[neighbour]=node;
DFS(neighbour);
}
}
}
void Unite(int x,int y)
{
if(R[x]<R[y])
TT[x]=y;
else
TT[y]=x;
if(R[x]==R[y])
R[x]++;
}
int findRoot()
{
int i;
for(i=1;i<=N;i++)
if(TT[i]==i)
return i;
}
void buildG()
{
for(int i=1;i<=Number;i++)
{
int a,b;
a=Array[Solution[i]].x;
b=Array[Solution[i]].y;
int cost=Array[Solution[i]].c;
G[a].push_back(b);
G[b].push_back(a);
Cost[a].push_back(cost);
Cost[b].push_back(cost);
}
}
void solveAPM()
{
int i;
for(i=1;i<=N;i++)
TT[i]=i;
for(i=1;i<=M;i++)
{
if(Father(Array[i].x)!=Father(Array[i].y))
Unite(Father(Array[i].x),Father(Array[i].y)),Result+=Array[i].c,Number++,Solution[Number]=i;
}
}
void Solve(int x,int y)
{
if(Level[y]>Level[x])
swap(x,y);
int Max=0;
while(Level[x]>Level[y])
{
Max=max(Max,C[x]);
x=F[x];
}
while(x!=y)
{
Max=max(Max,C[x]);
x=F[x];
Max=max(Max,C[y]);
y=F[y];
}
g<<Max<<"\n";
}
int main()
{
Read();
solveAPM();
buildG();
DFS(1);
while(K--)
{
int a,b;
f>>a>>b;
Solve(a,b);
}
return 0;
}