vineri, 14 februarie 2014
Probleme rezolvate
Probleme rezolvate
1.
1.
| Matricea lanturilor - algoritmul Roy-Warshall Se citeste un graf neorientat cu n noduri si m muchii dat prin vectorul muchiilor. Sa se construiasca o matricea existentei lanturilor(a[i][j] este 1 daca exista lant de la i la j si 0 in caz contrar). Ex: Pentru graful din imagine se obtine matricea lanturilor urmatoare: 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 |
#include<fstream.h>
int k,m,n,x[100],a[100][100],p[100];
fstream f("graf.in",ios::in);
fstream g("graf.out",ios::out);
void citire()
{int x,y;
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
}
void rw()
{int i, j, k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
if(a[i][j]==0)
a[i][j]=a[i][k]*a[k][j];
}
void afis()
{for(int i=1;i<=n;i++)
{g<<endl;
for(int
j=1;j<=n;j++)
g<<a[i][j]<<" ";
}
}
void main()
{citire();
rw();
afis();
}
2.
| Se da un graf neorientat cu n varfuri si m muchii, citit prin vectorul muchiilor. Sa se afiseze pe linii separate componentele sale conexe. Ex: Pentru graful alaturat se vor afisa urmatoarele componente conexe: 1 2 4 5 3 7 6 |
#include<fstream.h>
int a[100][100],n,m,x[100],p[100];
void citire()
{ int i,l,c;
ifstream f("g.in");
f>>n>>m;
for(i=1;i<=m;i++)
{ f>>l>>c;
a[l][c]=1;
a[c][l]=1;
}
}
void bf(int k)
{ int i,s,d;
x[1]=k;
p[k]=1;
s=d=1;
while(s<=d)
{ for(i=1;i<=n;i++)
if(a[x[s]][i]==1 && !p[i])
{ d++;
x[d]=i;
p[i]=1;
}
s++;
}
for(i=1;i<=d;i++) cout<<x[i]<<" ";
cout<<endl;
}
void main()
{ citire();
int i;
for(i=1;i<=n;i++)
if(!p[i]) bf(i);
}
vineri, 24 ianuarie 2014
! Observatii
üOrice varf izolat este considerat componenta conexa.
üDaca
numarul componentelor conexe dintr-un graf este mai mare decât 1, atunci graful
nu este conex.
üUn
graf conex are o singura componenta conexa, care cuprinde toate nodurile sale.
üÎn
teoria grafurilor,
un graf
conex
este
un graf
neorientat în
care există un drum între oricare două noduri distincte. Un graf neorientat
conex ,care
are un nod cu proprietatea că dacă acel nod este eliminat (împreună cu muchiile
adiacente), graful își pierde proprietatea de conectivitate, se numește
1-conex.
Similar, un graf este 2-conex
dacă pentru a-i elimina proprietatea de conexitate, este nevoie de eliminarea a
două noduri. În general, dacă dintr-un graf conex este nevoie să se elimine un
minim de
k
noduri (cu muchiile adiacente lor) pentru a obține un graf neconex, acel graf
este k-conex.
üNumarul
minim de muchii necesare ca
un graf neorientat sa fie conex este n-1
( n=numarul de noduri ) .
üUn graf conex cu n
noduri si m-1 muchii este aciclic si
maximal in raport cu aceasta proprietate.
üDaca un graf neorientat conex are
n noduri si m muchii , numarul de muchii care
trebuie
eliminate pentru a obtine un graf
partial conex , aciclic este
(m-n+1).
üDaca un graf are
n noduri si m muchii si p componente conexe numarul de muchii care
trebuie
eliminate pentru a obtine un graf
partial aciclic
( arbore) este (m-n+p) .
üPentu a obtine dintr-un graf neorientat conex , 2 componente conexe ,numarul
minim de muchii care
trebuie eliminate
este egal cu gradul
minim din graf .
Reprezentarea grafurilor neorientate
1.Cu ajutorul matricei de adiacenta(matricei adiacente).
A є M(m,n),n-nr de varfuri,m-nr de muchii.,unde
A(i,j)=1,daca exista muchia (i,j)
0,daca nu exista
OBS! Matricea de adiacenta este simetrica fata de diagonala
principala: A(i,j)=A(j,i).
OBS! Gradul unui varf x se poate determina calculand suma pe
linia x.
· Graf partial si subgraf
Def! Fie graful G=(X,U).Un graf partial al lui G,este un
graf G1=(X,V) ,cu V≤U(inclus).Altfel spus ,un graf partial se obtine pastrand
toate varfurile si eliminand niste muchii.
Def! Fie graful G=(X,U).Un subgraf
al lui G,este un graf S=(Y,T),unde Y≤X si T≤V,iar T va contine numai acele
muchii care au ambele extremitati in Y.Altfel spus,un subgraf S al lui G se
obtine din G eliminand niste varfuri si odata cu acestea acele muchii care au
cel putin o extremitate in submultimea eliminata.
Se numeste graf
complet cu n varfuri,notat K indice n (Kn),un graf G=(X,U) cu
proprietatea ca oricare doua varfuri sunt adiacente,adica oricare cuplu x,y є
X,esista muchia [x,y] є U.
Teorema! Un graf complet cu n varfuri are n(n-1)/2 muchii.
Definitie!Se numeste graf bipartit ,un graf G=(X,U) cu
proprietatea ca exista doua multimi distincte A si B incluse in X,astefel
incat:
-A∩B=multime
vida,A+B=X.(+ este reunit);
-toate
muchiile grafului au o extremitate in A si cealalta in B.
Definitie!Se numeste graf bipartit complet
,un graf bipartit cu proprietatea ca pentru orice varf x din A si orice varf y
din B , exista muchia [x,y].(A+B=X).
Grafuri neorientate. Probleme propuse
- Fie un graf neorientat memorat prin matricea de
adiacente si o succesiune de k noduri. Sa se determine daca succesiunea
citita este un lant din graf
- Din fisierele mat1.in si mat2.in se citesc doua
matrici patratice associate grafurilor g1 si g2. Sa se deremine daca g2 este graf
partial pentru g1
- Fie o harta cu n orase. Cele n orase se citesc din
fisier. Intre cele n orase exista m drumuri. Se cunosc distantele celor n
drumuri.
- Sa se determine daca orasul x si
orasul y sunt vecine
- Sa se afiseze lungimile tuturor
localitatilor intre care exista drum direct
- Sa se determine lungimea minima
a drumului dintre doua localitati citite de la tastatura
- La o receptie sunt invitate n personae. Se cunosc
numele celor n persoane . Intre anumite persoane exista relatii
de colaborare. Sa se determine daca se pot dispune cele n personae la o
masa rotunda astfel incat intre oricare doua personae alaturate sa existe
relatii. Se citesc : numele persoanelor si cele m relatiile sub forma de
perechi de nume
- Un eschimos locuieste la iglul cu numarul z. El are o
harta pe care sunt marcate iglu-urile din zona (numerotate de la 1 la n)
si distantele dintre acestea. Stiind ca din cauza frigului eschimosul nu
poate sa parcurga o distanta mai mare de 20 km fara oprire, afisati o
varianta de a ajunge la prietenul lui care locuieste la iglul
cu numarul w, eventual cea mai scurta varianta care indeplineste cerinta
data. Cati kilometri a
parcurs eschimosul?
- Un graf neorientat este bipartit daca exista o
partitie a multimii nodurilor in doua multimi A si B astfel incat oricare
doua varfuri din aceeasi multime sa nu fie adiacente. Sa se scrie un
program care verifica daca un graf este bipartit si in caz afirmativ sa se
tipareasca multimile A si B
- Problema colorarii unei harti. Se citesc 4 culori
(siruri de caractere) si denumirile a n tari (siruri de caractere) . Sa se
coloreze harta astfel incat sa nu existe doua tari alaturate avand aceeasi
culoare. Se va afisa o solutie : tara-culoare,
tare-culoare etc.
- Sa se coloreze un graf astfel incat oricare doua
muchii incidente cu acelasi nod sa fie colorate diferit. Care este numarul
minim de culori necesar.
- O pestera are n incaperi, fiecare situata la o
adancime h. Configuratia pesterii este data de cele m culoare de acces
intre camerele pesterii (culoarele sunt date ca extremitati). In incaperea
s exista un izvor de apa sulfuroasa. Se dau n, m, cele m culoare (ca
perechi x-y), s si adancimile h ale camerelor. Determinati incaperile
inundate si culoarele umezite.
- Fie un graf neorientat. Sa se determine daca graful
contine cicluri.
Descompunerea in componente conexe a unui graf neorientat, dat prin matricea de adiacenta
#include<fstream.h>
int s[20],a[20][20],n,i,j,k;
int s[20],a[20][20],n,i,j,k;
void df(int nod)
{
int k;
cout<<nod<<" ";
s[nod]=1;
for(k=1;k<=n;k++)
if((a[nod][k]=1) && (s[k]==0)) df(k);
}
{
int k;
cout<<nod<<" ";
s[nod]=1;
for(k=1;k<=n;k++)
if((a[nod][k]=1) && (s[k]==0)) df(k);
}
void main()
{
fstream f("graf.txt",ios::in);
f>>n;
while(f>>i>>j) a[i][j]=1;
f.close();
k=1;
for(i=1;i<=n;i++)
if(s[i]==0)
{
cout<<"componenta "<<k<<endl;
df(i);
cout<<endl;
k++;
}
}
{
fstream f("graf.txt",ios::in);
f>>n;
while(f>>i>>j) a[i][j]=1;
f.close();
k=1;
for(i=1;i<=n;i++)
if(s[i]==0)
{
cout<<"componenta "<<k<<endl;
df(i);
cout<<endl;
k++;
}
}
Sa se verifice daca un graf este hamiltonian
Fiind dat un graf neorientat memorat prin matricea de adiacenta sa se determine daca graful este Hamiltonian sau nu.
Notiuni teoretice
Definitie: Se numeste ciclu hamiltonian un ciclu elementar care trece prin toate varfurile grafului.
Definitie: Un graf care admite un ciclu hamiltonian se numeste graf hamiltonian.
#include<fstream.h>
int st[100],n,m,k,a[20][20];
int ns;
int e_valid()
{if(k>1)
if(!a[st[k-1]][st[k]])
return 0;
else
for(int i=1;i<=k-1;i++)
if(st[i]==st[k])
return 0;
if(k==n)
if(!a[st[1]][st[k]])
return 0;
return 1;
}
void afisare()
{for(int i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<st[1];
k=0;
ns++;
}
void back()
{k=1;
while(k>0)
if(st[k]<n)
{st[k]++;
if(e_valid())
if(k==n)
afisare();
else
{k++;
st[k]=0;}
}
else
k--;
}
void main()
{
fstream f;
f.open("hamiltonian.in",ios::in);
int u,v;
if(f)
cout<<"ok!";
else
cout<<"eroare";
cout<<endl;
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>u>>v;
a[u][v]=a[v][u]=1;
}
cout<<"matricea de adiacenta "<<endl;
for( i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
back();
if(ns==0)
cout<<”nu exista solutii”;
}
Abonați-vă la:
Postări (Atom)
