View difference between Paste ID: 8BrZKwfs and a8exxhrr
SHOW: | | - or go back to the newest paste.
1
-grafo 
2
	25-06-2012
3
	11-09-2015
4
	22-09-2011
5
	20-02-2015
6
	24-06-2013
7
	14-02-2013
8
	17-07-2015
9
-albero
10
	01-31-2013
11
	11-09-2015
12
	14-02-2013
13
	14-06-2013
14
15
16
prova asd 2011-09
17
Albero
18
Algo2(t,x,p,k1,k2)
19
int u=0,v=0;
20
	if(t)
21
		if(t.k >= k1 and t.k <= t.k)
22
			u=Algo(t.sx,x,t,k1,k2)
23
			v=Algo(t.dx,x,t,k1,k2)
24
25
			if( (u+v)>=x and (t.k%2==0) )
26
				if(p)
27
					if(p.sx==t)
28
						p.sx=cancella(t)
29
					else p.dx=cancella(t)
30
				else return -1;
31
			return u+v+1
32
	
33
	return u+v;
34
endAlgo2
35
Algo1(x,k1,k2,t)
36
	if(Algo2(t,null,x,k1,k2)==-1)//cancella la radice dell'albero
37
		t=cancella(t)
38
endAlgo1
39
40
Grafo
41
DSF(G:grafo)
42
bool prosegui=false
43
	for each vertice u E V
44
		do colore[u]= Bianco
45
46
	pred[u]= NIL
47
48
	for each vertice u E V and !prosegui
49
		if colore[u]= Bianco
50
			prosegui=DFS-Visita(G,u,pred);
51
			if(prosegui)
52
				stampaPercorso(G,s,v,pred)
53
				
54
endDsf
55
DSF-Visita(G:grafo,u:vertice,pred[]:vertice) : bool
56
	bool cicloTrovato=false;
57
	colore[u]=Grigio
58
59
	for each vertice v E Adiac[u] and !cicloTrovato
60
		if colore[v]= Bianco
61
			pred[v]= u
62
			cicloTrovato=DFS-Visit(G,v,pred)
63
		else if(colore[v]=grigio)
64
			return true;
65
66
	colore[u]=Nero
67
68
return cicloTrovato
69
endDfsVisit
70
71
stampaPercorso(G:grafo,s:vertice,v:vertice,pred[]:vertice
72
	if(v==s)
73
		print s
74
	else
75
		stampaPercorso(G,s,pred[v],pred)
76
		print v
77
78
grafo 26-06-2014
79
80
Grafo
81
DSF(G:grafo,v:vertice)
82
//Crea e alloca Grafo G'
83
	for each vertice u E V
84
		do colore[u]= Bianco
85
86
	G'.V'=G.V
87
	DFS-Visita(G,v,G');
88
			
89
endDsf
90
DSF-Visita(G:grafo,u:vertice,G':Grafo)
91
92
	colore[u]=Grigio
93
94
	for each vertice v E Adiac[u]
95
96
		if (colore[v]= Bianco or colore[v] = Nero) 
97
			G'.Adj[u]=Insert(u,v);
98
99
				if(colore[v]= Bianco)
100
					DFS-Visit(G,v,G')
101
102
	colore[u]=Nero
103
104
endDfsVisit
105
106
grafo 11-09-2015
107
DFS(G,r)
108
boolean continua = true
109
int n = r.size,i;
110
	i=n-1
111
	foreach v in V
112
		c[v]=nero
113
	foreach v in r
114
		c[v]=bianco
115
116
	while(i>=0 and continua==true){
117
		if(c[r[i]]==bianco)
118
			dfs_visit(G,r[i])
119
		else	
120
			 continua = false
121
		i=i-1;
122
	}
123
124
	if(continua==true)
125
		print("r è ordinamento topologico)
126
	else print("r non è ordinamento topologico)
127
end DFS
128
129
dfs_visit(G,v)
130
	c[v]=grigio
131
	foreach u in Adj(v)
132
		if(c[u]==bianco)
133
			dfs_visit(G,u)
134
135
	c[v]=nero
136
endDfs
137
138
albero 25-06-2012
139
algo(t,x,k1,k2,p)
140
int sx=0,dx=0,h=0
141
	if(t)
142
		if(t.k<=k1)
143
			sx=algo(t.sx,x,k1,k2,t)
144
			dx=algo(t.dx,x,k1,k2,t)
145
		else if(t.k<=k2)
146
			sx=algo(t.sx,x,k1,k2,t)
147
			dx=algo(t.dx,x,k1,k2,t)
148
			
149
			h=sx+sx+1
150
			
151
			if(h<=x)
152
				if(p)
153
					if(p.sx=t)
154
						p.sx=cancella(t)
155
					else p.dx=cancella(t)
156
	return h
157
158
albero 2013 01 31
159
algo(t,k1,k2,a[],x)
160
i=0;
161
	if(t)
162
		if(t.k>=k1)
163
			i=algo(t.sx,k1,k2,a[],x)
164
		
165
		if(t.k>=k1 and t.k<=k2)
166
			a[i]=t.k
167
			i=i+1
168
		x=i;
169
		i=algo(t.dx,k1,k2,a[],i)
170
	
171
172
return x;
173
174
grafo 20-02-2015
175
176
SUCCO : Trasponi grafo,color i vertici di X neri cosi da non andarci a finire sopra.
177
	Fai BFS per ogni vertice di X, quando incontri vertice bianco se la sua 
178
	distanza dalla sorgente è < k allora signfica che esiste un percorso tale
179
	che non rispetti la proprietà di essere lungo > k, quindi inserisce in lista
180
	solamente quei vertici che quando vengono scoperti(bianchi) hanno dist[k]>k
181
182
Algo(G,X,k)
183
//Crea lista array L
184
	GT=TrasponiGrafo(G)
185
	foreach x in V
186
		c[v]=b
187
	foreach x in X
188
		c[x]=n
189
190
	foreach x in X
191
		L=BFS(G,x,k,L)
192
end Algo
193
194
BFS(G,s,k,L) : List
195
//crea array distanze dist[]
196
	dist[s]=0
197
	Q=ins(s)
198
	while(Q){
199
		u=estrai(Q)
200
		foreach i in V
201
			if(c[i]=b)
202
				c[i]=g;
203
				dist[i]=dist[u]+1;
204
				if(dist[i]>k)
205
					L=ins(i)
206
	}
207
return L;
208
endBFS
209
210
albero 11-09-2012
211
212
main(h1,h2,n1,n2)
213
int n = algo(t,null,h1,h2,n1,n2,k,0)
214
	
215
	if((n1<=n<=n2) and (h1<=0<h2) and (t.k%2==0))
216
		t=cancella(t)
217
end main
218
219
Algo(t,p,h1,h2,n1,n2,k,depth)
220
int sx=0,dx=0,d=0;
221
	if(t)
222
		if(t.k>=k)
223
			sx=Algo(t.sx,t,h1,h2,k,x+1)
224
		else
225
			sx=Algo(t.sx,t,h1,h2,k,x+1)
226
			dx=Algo(t.dx,t,h1,h2,k,x+1)
227
			
228
			d=sx+dx
229
			if((h1<= x <=h2) and (n1<= d <= n2) and (t.k%2==0))
230
				if(p)
231
					if(p.sx=t)
232
						p.sx=cancella(t)
233
					else p.dx=cancella(t)
234
235
			d=d+1
236
237
return d
238
end algo
239
240
25-06-2012
241
242
IDEA :  Marcare di colore rosso i vertici di A che NON vengono raggiunti da nessun 
243
	vrtice di B tramite un percorso lungo più di K. Al termine dell'algoritmo
244
	se c'è almeno un vertice di A ancora rosso allora la distanza di A da B non è k
245
	Nello specifico ,sia k la distanza data in input:
246
	Trasponi il grafo, colora A di verde all'iniziio,B di nero e il resto bianco.
247
	Lancia una bfs su ogni vertice di B. Durante una qualsiasi visita da un vertice 
248
249
x di B appena
250
	trovo un vertice di A la prima volta (sarà verde) succede che:
251
		1)lo coloro di rosso se dista da x meno di k e lo inserisco in coda 
252
253
Q.Questo
254
		vertice verrà confrontato con gli altri di B al fine di verificare se 
255
256
almeno
257
		uno dei B lo raggiunge in un percorso >k.
258
					altrimenti
259
		2)se dista >k  da x ho verificato la proprietà (esiste un b per a tale 
260
261
che D(a,b)>k)
262
		quindi lo coloro di grigio e tale vertice prosegue normale la sua vita 
263
264
fino a diventare nero.
265
	
266
	Mentre data un'altra qualsiasi iterazione con un altro vertice x' di B,se 
267
268
incontro un vertice di A
269
	già visitato in passato (quindi rosso) si ha che Grazie al punto 1) il vertice 
270
271
da verde è passato a rosso ed è stato inserito in coda, 
272
	dunque i suoi adiacenti sono stati già controllati (grazie a questo giochetto 
273
274
dei 2 colori evito reiserimenti inutili) e quindi 
275
	può succedere che :
276
		3)se stavolta la distanza dai lui ad  x' è >k, esso viene colorato 
277
278
direttamente di nero e finisce la sua vita.
279
						altrimenti
280
		4)resta rosso, in attesa di un successivo controllo sulla distanza tra 
281
282
lui ed un altro vertice di B
283
284
	Per qualsiasi altro vertice di A invece, esso viene trattato 
285
286
normalmente,colorato di grigio e inserito in coda per
287
	esplorare i suoi vertici.
288
	Al termine viene fatto uno scorrimento della lista di A, se c'è ancora un rosso 
289
290
allora nessun B lo raggiungeva tramite percorso
291
	>k e quindi FALSO.
292
293
Algo(G,A,B,k)
294
//crea array colori c[]
295
boolean continua = true
296
	GT=TrasponiGrafo(G);
297
298
	foreach x in V
299
		c[v]=bianco			
300
	foreach x in A
301
		c[v]=verde
302
	foreach x in B
303
		c[v]=nero
304
305
	foreach x in B
306
		bfs(G,x)
307
308
	foreach x in A and continua
309
		if(c[x]=rosso)
310
			print"A non dista "k" da B
311
			continua=false;
312
313
end algo
314
bfs(G,x,k)
315
	dist[x]=0;
316
	Q=ins(x)
317
	while(Q){
318
		u=testa(Q)
319
		foreach i in Adj(x)
320
				dist[i]=dist[u]+1
321
				if(c[i]=bianco)
322
					c[i]=grigio
323
					Q=ins(i)
324
				else if(c[i]=verde or rosso)
325
					if(c[i]=verde and dist[i]>k)
326
						c[i]=grigio
327
						Q=ins(i)
328
					else if(c[i]=verde and dist[i]<k )
329
						c[i]=rosso
330
						Q=ins(i)
331
					else if(c[i]=rosso and dist[i]>k)
332
						c[i]=nero
333
			
334
		if(c[u]!=rosso)
335
			Decoda(Q)
336
			c[u]=nero
337
338
	}//endwhile
339
end bfs
340
341
22-09-2011
342
343
IDEA : Utilizzare una BFS per scoprire se ci sono cicli. In caso di ciclo viene 
344
345
utilizzato
346
	l'array dei predecessori per ricostruire il percorso contenente il ciclo.
347
	Nel dettaglio, viene lanciata una BFS su ogni vertice bianco di V.
348
	Durante la visita a partire da una sorgente s può succedere che:
349
		1)viene incontrato un vertice bianco, si prosegue come di norma nella 
350
351
bfs
352
				oppure
353
		2)viene incontrato un vertice nero :
354
			2)in questo caso siamo in un ciclo solamente se la distanza 
355
356
dalla radice s(ricalcolata
357
				per ogni nuova radice) del vertice corrente u (di cui 
358
359
stiamo analizzando gli adiacenti)
360
				e dell'adiacente di u appena estratto (vertice i) è 
361
362
dist[u]>dist[i]
363
				(ovvero poichè u dista da s di più di i, signfica che i 
364
365
è stato scoperto lungo
366
				qusto percorso e dunque è un ciclo).
367
				Infatti nel caso in cui c[i]= nero e dist[u]<dist[i] 
368
369
signfica che siamo in una nuova
370
				bfs da una nuova radice e abbiamo ricalcolato la 
371
372
distanza di i dalla sorgente s per cui
373
				non è un ciclo (arco in avanti)
374
375
Algo(G)
376
//crea array colori color[] e pred[] e distanze[]
377
boolean cicloTrovato = false
378
	foreach x in V
379
		c[x]=bianco
380
		pred[x]=null
381
		dist[x]=infinito	
382
383
	foreach x in V and (!cicloTrovato)
384
		if(c[x]=bianco)
385
			cicloTrovato=bfs(G,x,color,pred,dist)
386
387
	if(!cicloTrovato)
388
		"Il grafo è aciclico"
389
390
end algo
391
392
bfs(G,s,color,pred):cicloTrovato
393
boolean cicloTrovato = false
394
	pred[s]=null
395
	dist[s]=0
396
	c[s]=grigio
397
	Q=ins(s)
398
	while(Q){
399
		u=testa(Q)
400
		foreach i in Adj(u) and !cicloTrovato
401
				dist[i]=dist[u]+1
402
				if(c[i]=bianco)
403
					c[i]=grigio
404
					pred[i]=u
405
					Q=ins(Q,i)
406
				else if( (c[i] = nero) and (dist[u]>dist[i]))
407
						cicloTrovato=true;
408
						print"Il grafo contiene un ciclo nel 
409
410
percorso" 
411
						print(G,s,u,pred[])
412
					
413
	
414
	    Decoda(Q)
415
	    c[u]=nero
416
	}//endwhile
417
return cicloTrovato;
418
end bfs
419
420
print(G,s,u,pred[])
421
	temp=u
422
	while(temp!=null){//stampa il percorso al contrario :/
423
		print temp
424
		temp=pred[temp;
425
	}
426
end print
427
428
albero 11-09-2015
429
Algo(t,k,p') :int
430
nodobst p=p',pcand=p',cand=null,temp=t
431
int ris=0
432
	while(temp and temp.k!=k)
433
		if(temp.k<k)
434
			p=temp
435
			temp=temp.dx
436
		else
437
			if(temp.k%2==0)
438
				pcand=p
439
				cand=temp
440
			p=temp
441
			temp=temp.sx
442
443
	if(cand and temp.dx)
444
		p=temp
445
		temp=temp.dx
446
		while(temp)
447
			if(temp.k%2==0)
448
				pcand=p
449
				cand=temp
450
		   p=temp
451
	           temp=temp.sx
452
453
	if(pcand and cand)
454
		if(cand=pcand.sx)
455
			pcand.sx=cancella(cand)
456
		else pcand.dx=cancella(cand)
457
	else ris=1
458
459
return ris
460
endAlgo
461
main(t,k)
462
	n=algo(t,k,null)
463
	if(n=1)//successore testa albero
464
		t=cancella(t)
465
466
grafo 24-06-2013
467
468
dfs(G,a,b)
469
boolean trovato = false;
470
boolean continua = true;
471
	foreach v di V
472
		c[v]=b
473
474
	foreach v di V and !trovato and continua
475
		if(c[v]=b)
476
			trovato=dfs_visit(G,v,a,b)
477
			if((c[a]=nero and c[b]=bianco))
478
				continua=false
479
480
	if(trovato=true)
481
		print "L'arco a b sta in un ciclo"
482
	else print "No" 
483
		
484
return continua;
485
end dfs;
486
487
dfs_visit(G,s,a,b){
488
boolean trovato = false;
489
	c[s]=g
490
	foreach x in Adj(s) and !trovato
491
		if(c[x]=b)
492
			c[x]=g
493
			trovato=dfs_visit(G,x,a,b)
494
		else if(c[x]=g)
495
			if((c[a]=g and c[b]=g))//Se nel ciclo sono grigi oppure uno dei 
496
497
due
498
				trovato=true;
499
	c[s]=n
500
return trovato;
501
}
502
end dfs_visit
503
504
grafo 14-02-2013
505
Algo(G,A,B)
506
//Crea sottografo G2
507
508
	foreach v in V 
509
		c[v]=b
510
511
	foreach v in B
512
		if(c[v]=b)
513
			dfs_visit(G,v)//classica dfs_visit DFS
514
515
516
	GT=TrasponiGrafo(G)
517
518
	foreach v in A
519
		if(c[v]=b)
520
			dfs_visit_mod(GT,G2,v)//dfs_visit modificata
521
return GT
522
end Algo;
523
524
dfs_visit_mod(G,G2,s)
525
	c[s]=g
526
	G2.VertList=ins(G2,s)
527
	foreach v in Adj(s)
528
		if(c[v]=b)
529
			G2.Adj(v)=ins(s)
530
			df_visit_mod(G,G2,v)
531
	
532
	c[s]n
533
end dfs_visit_mod
534
535
TrasponiGrafo(G)
536
	//Crea grafo GT e copia array di G in GT
537
	
538
	foreach v in V
539
		foreach u in Adj(v)
540
			G2.Adj(u) = insert (u,v)
541
return GT;
542
end
543
		
544
albero 14-02-2013
545
Algo(t,a)
546
int numNodi=0	
547
548
	numNodi=creaArray(t,a,0)
549
	t'=bilancia(t',A,0,n)	
550
551
endAlgo
552
553
bilancia(a,t,t',inf,sup)
554
	
555
	if(sup>inf)
556
		mid=(inf+sup)/2
557
		t'=creaNodo(a[mid])
558
		t'.sx=bilancia(t'.sx,inf,mid)
559
		t'.dx=bilancia(t'.dx,mid+1,sup)
560
return t'
561
and bilancia
562
563
creaArray(a,t,i)
564
565
	if(t)
566
		indice=creaArray(t.sx,a,i)
567
		a[indice]=t.k
568
		return creaArray(t.dx,a,indice+1)
569
570
return i;
571
572
albero 14-06-2013
573
algo(t,pos,prof,l1,l2,p)
574
int curind=0,curind2=0;
575
	if(t)
576
		curind=algo(t.sx,pos,prof+1,l1,l2,t)
577
		
578
		curind2=algo(t.dx,pos,curind+1,l1,l2,t)
579
580
		if(curind%3==0)
581
			if(p)
582
				if(p.sx==t)
583
					p.sx=cancella(t)
584
				else p.dx=cancella(t)
585
		
586
		pos=curind2;
587
588
return pos;
589
590
grafo 17-07-2015
591
IDEA: Mi sono basato dinuovo sull'idea di cercare un percorso massimale di soli vertici
592
dispari,quando lo trovo ritorno false a catena e termina l'algoritmo. Durante la visita
593
quando trovo un vertice pari lo coloro di nero e non scendo a visitare nulla al di 
594
595
sotto
596
di lui, poichè i percorsi massimali che potrò trovare rispetteranno la proprietà di 
597
598
avere
599
almeno un vertice pari. Quando invece sono in presenza di un ciclo oppure di un vertice 
600
601
pozzo
602
ritorno direttamente false, in quanto lui e quelli prima di lui erano tutti dispari.
603
604
dfs(G,u,VAL)
605
	foreach k in V
606
		c[k]=b
607
608
	if(VAL[u]%2==0 OR dfs_visit(G,u,VAL)==true)
609
		print"Tutti i percorsi massimali contengono un vertice pari"
610
	else print"Esiste almeno un percorso massimale che contiene tutti vertici 
611
612
dispari"
613
end dfs
614
dfs_visit(G,s,VAL):BOOLEAN
615
boolean risp = true
616
	c[s]=g
617
	if(Adj(s)!=NULL)
618
		foreach x in Adj(s) and risp=true
619
			if(c[x]=b)
620
				if(VAL[x]%2!=0)
621
					risp=dfs_visit(G,x,VAL)
622
				else c[x]=n
623
			else if(c[x]=g)
624
				risp=false
625
	else risp=false
626
	c[s]=n
627
return risp