|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
[C-C++] Grafi...riconoscere nodi serie/parallelo..AIUTOOOO!!
Ciao a tutti!
Mi potete aiutare a svolgere questo programma in C(va benissimo pure in C++ )... Dovrei fare in modo che chiesti in input: per prima cosa quanti archi dovranno formare il grafo e poi successivamente ogni arco con i suoi estremi(A-B B-C C-D ecc.. fino al numero scelto all'inizio). Se ad es pero' scrivo B-C due volte ci saranno due archi in parallelo e cosi' via... Cioè il programma deve riconoscere se gli archi sono in parallelo o in serie e scrivelo in output.... Grazie mille e vi prego aiutatemi è importante |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
visto che non hai specificato come implementare il grafo ti consiglio di utilizzare una matrice di adiacenza, ovvero una matrice (quadrata) M in cui l'elemento M(i,j) ti dice se c'e' (valore !=0) un arco tra l'i-esimo nodo e il j-esimo oppure no (valore ==0).
Se per la matrice usi un array di array, M(i,j) lo scrivi M[i][j] e quindi per "inserire" un arco basta scrivere M[i][j] = 1; A questo punto il modo per controllare "archi doppi" dovresti averlo gia' capito |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
Quote:
ti prego grazie mille |
|
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Codice:
const int MAX_SIZE=50;
int grafo[MAX_SIZE][MAX_SIZE];
for ( "ogni elemento di grafo" )
grafo[i][j] =0;
int nodi,archi;
cin >> nodi;
cin >> archi;
while( archi-- )
{
cin >> da >> a;
if ( grafo[da][a] == 1 )
{
cout << "arco parallelo da " da << " a" << a << endl;
}
grafo[da][a] = 1;
}
|
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
ho cercato di completare il tuo prog cosi'..
Codice:
#include <iostream.h>
#include<stdlib.h>
main(){
int da,a,i,j;
const int MAX_SIZE=50;
int grafo[MAX_SIZE][MAX_SIZE];
for (i=0; i<10; i++){
for (j=0; j<10; j++)
{
grafo[i][j] =0;
}
}
int nodi,archi;
cin >> nodi;
cin >> archi;
while( archi-- )
{
cin >> da >> a;
if ( grafo[da][a] == 1 )
{
cout << "arco parallelo da " << da << " a " << a << endl;
}
grafo[da][a] = 1;
}
system("pause");
}
grazie mille |
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
questo e' l'input e l'output che ottengo io col tuo programma: ( occhio che i primi due 10 sono il numero di nodi e di archi ) Quote:
|
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
ah, forse ho capito, guarda che le etichette per i nodi sono interi minori di N ( con N il numero di nodi), non puoi usare numeri piu' grandi o lettere, per fare quello devi complicare un po' di piu' il programma.
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
l'output è questo
Codice:
10 10 1 2 2 3 3 2 1 2 arco parallelo da 1 a 2 1 2 arco parallelo da 1 a 2 1 3 1 3 arco parallelo da 1 a 3 2 1 3 2 arco parallelo da 3 a 2 5 1 Premere un tasto per continuare . . . Funge quindi cosi'?è corretto l'output? Ma xchè devo scrivere quei numeri?che rappresentano i numeri dei nodi??non posso fare che inserisco A B B C C D ecc??come? Cmq potresti aggiungerci anche il controllo x quelli che sono in serie?? Grazie mille Ultima modifica di ANDREA_NET-_DSL : 19-03-2004 alle 17:50. |
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Codice:
10 10 A B B C C B A B arco parallelo da A a B A B arco parallelo da A a B A C A C arco parallelo da A a C B A C B arco parallelo da C a B E A A dire il vero io sono partito dal presupposto che il grafo sia diretto... E' cosi' o e' non diretto ? Se vuoi inserire le lettere al posto dei numeri puoi fare nel seguente modo: Codice:
...
char tabella_simboli[256];
char c = 'A'; int i=0;
while ( c <= 'Z' )
{
tabella_simboli[c] = i;
c++; i++;
}
Codice:
cin >> da >> a;
const char* t = tabella_simboli;
if ( grafo[ t[da] ][ t[a] ] == 1 )
{
cout << "arco parallelo da " da << " a" << a << endl;
}
grafo[ t[da] ][ t[a] ] = 1;
|
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
chiarissimo
Cmq per la serie nn so che intendi con come la devo trattare...non abbiamo fatto un modo particolare ma solo sapere ad es che se scrivo A_B B_C C_D sono in serie... mi puoi aiutare?? ps mi sto studiano il codice intanto ps2: VERSIONE MESSA APPOSTO CON LETTERE ECC Codice:
#include <iostream.h>
#include <stdlib.h>
const int MAX_SIZE=50;
int i,j;
char da,a;
int grafo[MAX_SIZE][MAX_SIZE];
main(){
char tabella_simboli[256];
char c = 'A'; int i=0;
while ( c <= 'Z' )
{
tabella_simboli[c] = i;
c++; i++;
}
for (i=0; i<10; i++){
for (j=0; j<10; j++)
{
grafo[i][j] =0;
}
}
int nodi,archi;
cout << "Inserisci il numero dei nodi (n* elementi coppie)" << endl;
cin >> nodi;
cout << "Inserisci il numero degli archi(n* coppie nodi) "<< endl;
cin >> archi;
while( archi-- ){
cout << "Inserisci in successione,separati da spazio, il " << archi << " e il SECONDO" << endl;
cin >> da >> a;
const char* t = tabella_simboli;
if ( grafo[ t[da] ][ t[a] ] == 1 )
{
cout << "arco parallelo da " << da << " a " << a << endl;
}
grafo[ t[da] ][ t[a] ] = 1;
}
system("pause");
}
Ultima modifica di ANDREA_NET-_DSL : 19-03-2004 alle 18:20. |
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quello che intendevo dire e' che lo puoi fare in molti modi... ad esempio a te interessa che quando inserisci l'arco A-B ti dica "A-B e' in serie con B-C e B-D" o devi farlo alla fine ? E in questo caso basta farlo due a due o tutte le possibili combinazioni ? Dire ad esempio
"gli archi in serie sono: A-B B-C A-B B-D B-D D-A " o devi trovarti anche la tripletta "A-B B-D D-A" ? In ogni caso questa la lascio a te se scegli (ad esempio) il nodo 'A', tutti gli archi che escono da 'A' sono sulla riga grafo[ tabella_simboli['A'] ][i], con i che varia tra 0 e il numero massimo. Quindi se ti basta trovare tutte le coppie in serie puoi adottare un approccio del genere: cicli sulle tre variabili 'da' 'a' e 'per' e controlli se c'e' un arco che va da 'da' a 'per' e uno da 'per' ad 'a' qualcosa come Codice:
int da,a,per; for( "cicla sulle tre variabili, per comodita' lavoriamo direttamente sui numeri e non sui nomi dei nodi" ) if ( grafo[da][per] == 1 && grafo[per][a] == 1 ) "i due archi sono in serie" |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
il ciclo che mi hai proposto è il seguente
Codice:
int da,a,per; for( "cicla sulle tre variabili, per comodita' lavoriamo direttamente sui numeri e non sui nomi dei nodi" ) if ( grafo[da][per] == 1 && grafo[per][a] == 1 ) "i due archi sono in serie" Codice:
int da,a,per;
for( da=0; da<n; da++ ){
for( a=0; a<n; a++ ){
for( per=0; per<n; per++ ){
if ( grafo[da][per] == 1 && grafo[per][a] == 1 )
cout << "i due archi sono in serie" << endl;
}
}
}
va nel ciclo while do ?? 'per' è una var nuova no? come opera? GRAZIE! ps non mi servono le triplette ma solo le coppie per la serie dico... Ultima modifica di ANDREA_NET-_DSL : 19-03-2004 alle 18:47. |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Aug 2002
Città: Umbria
Messaggi: 89
|
up
aiutatemi... grazie |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:30.



















