Situatie
Colorarea hartiei folosind metoda Greedy.
Fiind data o harta cu n tari, se cere o solutie de colorare a hartii, utilizand cel mult patru culori, astfel incat doua tari ce au frontiera comuna sa fie colorate diferit. Este demonstrat faptul ca sunt suficiente numai patru culori pentru ca orice harta sa poata fi colorata.
Exemplu:
colorare.in
6
alb verde galben rosu
1 2
1 3
1 4
1 5
1 6
2 3
2 5
2 6
3 4
3 5
4 5
5 6
colorare.out
1 alb
2 verde
3 galben
4 verde
5 rosu
6 galben
Solutie
<code='c++'>#include <fstream> using namespace std; ifstream fin("colorare.in"); ofstream fout("colorare.out"); int A[101][101];// A[i][j]==1 pt tari vecine, 0 altfel int X[101],n;//X[i]=indicele culorii tarii i char C[5][21];//culorile void afisare() { for(int i=1;i<=n;i++) fout<<i<<" "<<C[X[i]]<<"\n";//afisez tara si culoarea fout<<endl; } int valid(int k) {//1 daca tara k poate fi colorata cu X[k], 0 altfel for(int i=1;i<k;i++)//pt tarile colorate deja if(A[i][k]==1 && X[i]==X[k]) return 0;//exita tara invecinata care are aceeasi culoare=>0 return 1; } int alege(int k) {//alege culoarea minima valida for(int i=1;i<=4;i++)//am 4 culori { X[k]=i;//plasez culoarea if(valid(k)) return i;//daca e buna o returnez } return 0;//daca nu putem colora } void colorare() {//plaseaza in X[i] culoarea tarii i for(int i=1;i<=n;i++) X[i]=alege(i);//culoarea minima } int main() { int t1,t2; fin>>n;//citesc nr de tari for(int i=1;i<=4;i++) fin>>C[i];//citesc culorile while(fin>>t1>>t2)//pereche de tari vecine { A[t1][t2]=1;//pun 1 in matrice A[t2][t1]=1; } colorare(); afisare(); return 0; }</code='c++'>
Leave A Comment?