[shkola] 'Dyzdovnata' zadacha
- From: Rangel Dokov <rangel_dokov@xxxxxx>
- To: shkola@xxxxxxxxxxxxx
- Date: Sat, 22 Mar 2003 23:48:27 +0200
On Saturday 22 March 2003 19:47, you wrote:
>Ami kakvo da ti kaza za subject-a ... pisha s 0.5 cps(chars per
>second)... bavna mi e konzolata , plus tova po default na taia posta mi
>e Emacs-a a s nego hic ne se razbiram ... glupavo zivotno..
Ami shto ne si smenish default-a. Ako imat mutt probvaj s nego. Mutt rulez.
Samo da podkaram fetchmail + exim i shte mina na mutt ;-).
>Btw ako niakoi ia reshi pishete kakvo vi e reshenieto . Az mislih dnes s
>flow da ia napravia, ama mislia che ne e podhodiasto zatova ia napravih
>po drug nachin... pishete kakav e vashiat..ivo mai glavno kam tebe tova
Abe ne znam kolko raboti no eto moeto 'reshenie'. Polovinata kod prosto
poddyrza edna piramida (oshte se chudq shto ne go napravih po drug nachin).
Inache ideqta e linejno obhozdane ot naj-visokiq vryh nadulo kato ottichash
vodata.
P.S. Ako se napravi s dinamichna pamet za ulicite shte moze da se podkara i za
dosta po-golemi danni. V momenta max 10000 nodes, 1000 edges per node. Prosto
nishto ne spomena za ogranicheniq.
--
Rangel Dokov
#include <stdio.h>
#define MAXN 10000
#define MAXK 1000
int hight[MAXN];
double water[MAXN];
struct edge {
int count;
int hight;
int peers[MAXK];
} edges[MAXN];
int nodes;
int heap[MAXN];
int heap_cmp(int a, int b);
void push(int number);
int pop();
int heap_cmp(int a, int b) {
if (hight[a] > hight[b])
return -1;
return 1;
}
void push(int number) {
int cpos;
int tmp;
cpos = heap[0];
heap[0]++;
heap[cpos] = number;
while (cpos > 1) {
if (heap_cmp(heap[cpos], heap[cpos/2]) == -1) {
tmp = heap[cpos];
heap[cpos] = heap[cpos/2];
heap[cpos/2] = tmp;
cpos = cpos/2;
} else
break;
}
}
int pop() {
int retv;
int cpos;
int tmp;
if (heap[0] <= 1)
return -1;
retv = heap[1];
heap[0]--;
heap[1] = heap[heap[0]];
cpos = 2;
while (cpos < heap[0]) {
if ((cpos + 1 < heap[0]) && (heap_cmp(heap[cpos], heap[cpos+1])
== 1))
cpos++;
if (heap_cmp(cpos/2, cpos) == 1) {
tmp = heap[cpos];
heap[cpos] = heap[cpos/2];
heap[cpos/2] = tmp;
} else
break;
cpos *= 2;
}
return retv;
}
void add_edge(int from, int to) {
if (edges[from].count && edges[from].hight < hight[to])
return;
if (edges[from].hight == hight[to]) {
edges[from].peers[edges[from].count] = to;
edges[from].count++;
} else {
edges[from].count = 1;
edges[from].peers[0] = to;
edges[from].hight = hight[to];
}
}
int main() {
int i;
int tmp1, tmp2, tmp3;
int edgec;
int curr;
heap[0] = 1; // heap initialization ;-)
scanf("%d %d", &nodes, &edgec);
for (i = 1; i <= nodes; i++) {
scanf("%d", &hight[i]);
push(i);
}
for (i = 0; i < edgec; i++) {
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
if (hight[tmp1] == hight[tmp2]) {
water[tmp1] += tmp3/2.0;
water[tmp2] += tmp3/2.0;
continue;
}
if (hight[tmp1] < hight[tmp2]) {
add_edge(tmp2, tmp1);
water[tmp1] += tmp3;
} else {
add_edge(tmp1, tmp2);
water[tmp2] += tmp3;
}
}
while ((curr = pop()) != -1) {
for (i = 0; i < edges[curr].count; i++) {
tmp1 = edges[curr].peers[i];
water[tmp1] += water[curr]/(double)edges[curr].count;
water[curr] = 0;
}
}
for (i = 0; i < nodes; i++)
if (water[i])
printf("%d %.4f\n", i, water[i]);
return 0;
}
- Follow-Ups:
- [shkola] Re: 'Dyzdovnata' zadacha
- From: Ivaylo Riskov
- [shkola] Re: 'Dyzdovnata' zadacha
- From: Ivaylo Riskov
- References:
- [shkola] Re: Towa e source-a na programata za faktoriala
- From: Lyudmil Antonov
Other related posts:
- » [shkola] 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- » [shkola] Re: 'Dyzdovnata' zadacha
- [shkola] Re: 'Dyzdovnata' zadacha
- From: Ivaylo Riskov
- [shkola] Re: 'Dyzdovnata' zadacha
- From: Ivaylo Riskov
- [shkola] Re: Towa e source-a na programata za faktoriala
- From: Lyudmil Antonov