Pagini recente » Cod sursa (job #381416) | Cod sursa (job #719371) | Cod sursa (job #701778) | Cod sursa (job #2152194) | Cod sursa (job #1466571)
#include <stdio.h>
#define Smerenie 1000001
#define Nadejde 250001
typedef struct {
int v, k, next;
} cell;
int N;
int M;
int X;
int Y;
int mid;
int adj[Nadejde]; /// capetele listelor de adiacenta.
cell l[Smerenie]; /// listele de adiacenta alocate static.
char seen[Nadejde]; /// seen[i] este 1 doar daca nodul i a fost vizitat.
/** Adauga-l pe "v" la lista de adiacenta a lui "u". **/
void addEdge(int u, int v, int k, int pos) {
l[pos].v = v;
l[pos].k = k;
l[pos].next = adj[u];
adj[u] = pos;
}
/** Initializeaza "seen". **/
void init() {
int u;
for (u = 1; u <= N; u++) {
seen[u] = 0;
}
}
/** Parcurge recursiv graful, cu capacitatea "mid". **/
void dfs(int u) {
int pos;
if (!seen[u]) {
seen[u] = 1;
for (pos = adj[u]; pos; pos = l[pos].next) {
if (mid >= l[pos].k) {
dfs(l[pos].v);
}
}
}
}
/** Determina daca putem ajunge in "Y" cu capacitatea "mid". **/
void step(int lo, int hi) {
mid = (lo + hi) >> 1;
init();
dfs(X);
}
/** Cauta binar capacitatea minima. **/
int bSearch(int lo, int hi) {
while (hi - lo > 1) {
step(lo, hi);
if (seen[Y]) {
hi = mid;
} else {
lo = mid;
}
}
int save = mid;
step(lo, hi);
if (seen[Y]) {
return mid;
} else {
return save;
}
}
int main(void) {
int i, u, v, k, max = 1;
FILE *f = fopen("pscnv.in", "r");
fscanf(f, "%d %d %d %d", &N, &M, &X, &Y);
for (i = 1; i <= M; i++) {
fscanf(f, "%d %d %d", &u, &v, &k);
addEdge(u, v, k, i);
addEdge(v, u, k, i + M);
if (k > max) {
max = k;
}
}
fclose(f);
f = fopen("pscnv.out", "w");
fprintf(f, "%d\n", bSearch(1, max));
fclose(f);
/** Multumim Doamne! **/
puts("Doamne ajuta!");
return 0;
}