problema della connettività

Algoritmi,pseudocodice,diagrammi a blocchi.

Moderator: dome_firenze

problema della connettività

Postby Bit on Sun Nov 25, 2007 9:41 pm

Code: Select all
#include <stdio.h>
#define N 100

int main(void)
{
       int i, j, p, q, id[N], sz[N];
       
       for(i=0; i < N; ++i){
          id[i] = i;
          sz[i] = 1;
       }
       while(scanf("%d %d", &p, &q) == 2){
              for(i = p; i != id[i]; i = id[i]);
              for(j = q; j != id[j]; j = id[j]);
              if(i == j)
               continue;
              if(sz[i] < sz[j]){
               id[i] = j;
               sz[j] += sz[i];
             }
             else {
                       id[j] = i;
                       sz[i] += sz[j];
             }
             printf("%d %d\n", p, q);
      }
}
Bit
C Programmer
 
Posts: 462
Joined: Wed Jun 14, 2006 4:28 pm

problema della connettività

Sponsor

Sponsor


Postby k8 on Sun Nov 25, 2007 11:00 pm

uhm..
cos'è?

magari esponi il problema , e descrivi la risoluzione in pseudocofica,
in questa sezione è meglio usar solo pseudocodice :)


;)
Big-Bug cerca collaboratori.
Scrivete senza abbreviazioni e senza k, grazie.
k8
Admin
 
Posts: 2134
Joined: Tue Jun 06, 2006 4:00 pm

Postby Bit on Mon Nov 26, 2007 10:13 pm

immaginiamo di avere un dato oggetto p e un oggetto q, e dobbiamo stabilire una relazione tra di loro, ovvero in partenza vedere se sono connessi, se non lo sono provvediamo a connetterli. Con questo algoritmo si può fare.. i due for servono a fare un operazione di find e le successive itruzioni servono come union, cioè connette l'oggetto p con quello q.. successivamente se l'oggetto q è connesso con r lo sarà anche p. Questo algoritmo serve a risolvere dei problemi riguardanti le connessioni tra miliardi di pc
Bit
C Programmer
 
Posts: 462
Joined: Wed Jun 14, 2006 4:28 pm

Postby k8 on Mon Nov 26, 2007 10:42 pm

interessante 8)
Big-Bug cerca collaboratori.
Scrivete senza abbreviazioni e senza k, grazie.
k8
Admin
 
Posts: 2134
Joined: Tue Jun 06, 2006 4:00 pm

Postby Bit on Wed Nov 28, 2007 10:03 pm

Code: Select all
#include <stdio.h>
#define N 100

int main(void)
{
       int i, j, p, q, id[N], t;
       
       for(i=0; i < N; ++i){
          id[i] = i;
       }
       while(scanf("%d %d", &p, &q) == 2){
              if(id[p] == id[q])
               continue;
              for(t = id[p], i=0; i < N; ++i)
                 if(id[i] == t)
                  id[i] = id[q];
             printf("%d %d\n", p, q);
       }
}

guardate questo programma, e immagine di avere 10^6 oggetti (N = 10^6) e 10^9 coppie in un computer ke fa 10^9 istruzioni al secondo, supponendo ke il while richieda non + di 10 istruzioni, quanti giorni necessita questo algoritmo per terminare le operazioni?
Bit
C Programmer
 
Posts: 462
Joined: Wed Jun 14, 2006 4:28 pm

Postby Bit on Wed Nov 28, 2007 11:19 pm

credo ke la soluzione sia 10^7 sec...
Bit
C Programmer
 
Posts: 462
Joined: Wed Jun 14, 2006 4:28 pm


Return to Algoritmi

Who is online

Users browsing this forum: No registered users and 1 guest

cron