You are on page 1of 9

BÀI TOÁN TÔ MÀU

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
#define MAX 30

struct TOP
{
int clr; // Mau to cua 1 dinh
int unused_clr[MAX]; // Danh sach cac mau ko dc phep to cua 1 dinh
int clr_count; // Dem so mau ko dc phep to cua 1 dinh

};
struct GRAPH
{
int n; // So dinh cua Do thi G
int a[MAX][MAX]; // Ma Tran lien ket cua G
int used_clr[MAX]; // Danh sach cac mau da duoc dung
int clr_count; // So luong cac mau da dung
TOP top[MAX];
};

/////////////// Doc Ma Tran lien ket tu File /////////////////


void ReadGraph(GRAPH &G, char *path)
{
/// Mo file
FILE *pFile = fopen(path,"rt");
if(pFile ==NULL)
{exit(0);}
else
{
fscanf(pFile,"%d",&G.n); // Doc dinh
for(int i=0;i<G.n;i++) // Doc Ma Tran lien ket tu file
for(int j=0;j<G.n;j++)
fscanf(pFile,"%d",&G.a[i][j]);
}
fclose(pFile);
}
////////////////// In ra man hinh Ma Tran lien
ket ////////////////////////////
void PrintGraph(GRAPH G)
{ cout<<G.n<<endl;
for(int i=0;i<G.n;i++)
{cout<<endl;
for(int j=0;j<G.n;j++)
cout<<G.a[i][j]<<" ";
}
}

int MaxTop(GRAPH G)
{
int tonghang=0,b[MAX],i,j,max=0;
for(i=0;i<G.n;i++){
for(j=0;j<G.n;j++)
tonghang=tonghang+G.a[i][j];
b[i]=tonghang;
tonghang=0;

if(max<=b[i]){
max=b[i];
}
}
for(int k=0;k<G.n;k++)
if(b[k]==max && G.top[k].clr==-1) // Lay cac dinh co bac max va
chua dc to
return k;
}

void Start(GRAPH &G) {


G.clr_count= 0;
for(int i=0;i<MAX;i++){
G.used_clr[i]=0; // Tat ca cac mau deu chua dung
G.top[i].clr=-1; // Cac dinh luc dau chua co mau.
Value = -1
G.top[i].clr_count=0; // So mau chua dc phep to bang 0
for(int j=0;j<MAX;j++)
G.top[i].unused_clr[j]=-1; // Danh dau mau khong dc to cua 1 dinh
la chua co
}
G.used_clr[0]=1; // Dung thu 1 mau dau tien
}

int In_Array(int x, int b[]){


int r=0;
for(int i=0;i<MAX;i++){
if(x==b[i]){
r=1;
break;
}}
return r;
}

void Del_Edge(int max,GRAPH &G) {


for(int j=0;j<G.n;j++){
if(G.a[max][j] && G.a[j][max]) {
G.a[max][j]=0;
G.a[j][max]=0;
// Xoa canh cua dinh da dc to
if(!In_Array(G.top[max].clr,G.top[j].unused_clr)){ // Neu
mau chua nam trong day mau ko dc phep su dung
G.top[j].unused_clr[G.top[j].clr_count+
+]=G.top[max].clr;
}
}
}
}

int Same_color( int i,int max, GRAPH G) {


int r=0;
for(int k=0;k<G.n;k++){
if(G.top[max].clr==G.top[max].unused_clr[k]){
r=1;
break;}
}
return r;
}
void Coloring(GRAPH &G){
int max,j=0,flag;

Start(G);
// To mau ban dau cho 1 dinh
for(int i=0;i<G.n;i++){
max=MaxTop(G);
// Thu to bang nhung mau da to
do {
G.top[max].clr=j;
if(Same_color(j,max,G)) // Neu trung mau voi
nhung dinh khac va het mau co the to
flag=0;
else {
flag=1;
break;
}
}
while(G.used_clr[++j]!=0);
// To bang mau moi va danh dau mau moi la da dc to
if(flag==0) { // Dam bao chua sot mau nao
G.used_clr[++G.clr_count]=1;
G.top[max].clr=G.clr_count;
}
Del_Edge(max,G);
j=0;
}}
void Print_ColoredTop(GRAPH G){
for(int i=0;i<G.n;i++)
cout<<"\nDinh "<<i<<" mau : "<<G.top[i].clr;
}
void main()
{
GRAPH G;
ReadGraph(G,"C:\\matran_1.txt");
PrintGraph(G);
Coloring(G);
Print_ColoredTop(G);
getch();
}

BÀI TOÁN N-VIEC-M MAY

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#define MAX 100
struct MAY
{
int cv[MAX];
int t_time;

};
int chonviec(int *a,int n);
int chonmay(MAY *may,int m);

int chonviec(int *a,int n)


{
int temp=0,vt;
for(int i=0;i<n;i++)
{
if(temp<a[i])
{
temp=a[i];
vt=i;
}
}
a[vt]=0;
return temp;
}

int chonmay(MAY *may,int m)


{
int temp=may[0].t_time,vt=0;
for(int j=0;j<m;j++)
if(temp>may[j].t_time )
{
temp=may[j].t_time;
vt=j;
}
return vt;
}

void phancong(MAY *may,int *a,int n,int m)


{ int max_time,may_min_time; // CV co thoi gian lam lau nhat, may co thoi
gian lam viec thap nhat;
for(int k=0;k<m;k++)
{ may[k].t_time =0;
for(int h=0;h<MAX;h++)
may[k].cv[h]=0;
}
for(k=0;k<n;k++)
{
max_time=chonviec(a,n);
may_min_time=chonmay(may,m);
may[may_min_time].cv[k]=max_time;
may[may_min_time].t_time=may[may_min_time].t_time+max_time;
}
}

main()
{ MAY may[MAX];
int n,m,time[MAX];
cout<<"Nhap vao so may m="; cin>>m;
cout<<"Nhap vao so cong viec n=";cin>>n;
cout<<"Nhap vao thoi gian lam tung cong viec : ";
for(int i=0;i<n;i++)
{ cout<<"\nn["<<i<<"]=";
cin>>time[i];}

phancong(may,time,n,m);
cout<<"------------Ket qua--------------\n";
for(i=0;i<m;i++)
{cout<<"May "<<i<<": ";
for(int j=0;j<MAX;j++)
if(may[i].cv[j]!=0)
cout<<may[i].cv[j]<<" ";
cout<<"\nTong thoi gian lam viec : "<<may[i].t_time<<endl;
}
getch();
}

BÀI TOÁN LẬP LỊCH

#include <iostream>
#include <conio.h>
#include "stack.cpp"
#define MAX 12
using namespace std;

struct MANG_CON {
int pt[MAX]; /// Luu cac mang con
}mc[MAX];

struct BO {
int a[MAX]; /// Tra ve cac bo khong dc trung
int duyet[MAX]; /// Co danh dau dinh
int dem; /// Dem so dinh da dc danh dau trong 1 bo
int sodinh; /// Luu tong so dinh trong 1 bo
}bo[MAX];

struct MTLK { /// Luu ma tran lien ket


int a[MAX][MAX];
int duyet[MAX]; /// danh dau dinh da duyet
int dinh;
}mt;

void tao_mtlk(MTLK &mt) {


cout<<"Nhap vao so luong cac chu de : ";cin>>mt.dinh;
for(int i=0;i<mt.dinh;i++){
for(int j=0;j<mt.dinh;j++){
if(i!=j)
mt.a[i][j]=1;
}
}
}
void tao_bo(BO bo[]) {
int n;
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++)
bo[i].a[j]=-1;

cout<<"\nSo luong cac bo : ";cin>>n;


for(int i=0;i<n;i++){
cout<<"\nNhap so luong phan tu bo so "<<i<<". Nhap -1 de ket thuc :
";
cin>>bo[i].sodinh;
for(int j=0;j<bo[i].sodinh;j++)
cin>>bo[i].a[j];
}
}
void xuat_mt(MTLK mt) {

for(int i=0;i<mt.dinh;i++){
cout<<"\n";
for(int j=0;j<mt.dinh;j++)
cout<<mt.a[i][j]<<" ";

}
}

int ss(stack s,BO bo[],int vt){ /// So sanh cac phan tu trong mang a
va cac bo
int val;
int i,j,sum[MAX];

for(i=0;i<MAX;i++){
for(j=0;j<MAX;j++){
if(s.e[vt]>=0 && s.e[vt]==bo[i].a[j]){
bo[i].duyet[j]=1;
bo[i].dem++;
}
}
}
i=0;
do{
if(bo[i].dem==bo[i].sodinh) /// bien dem tam thoi cac dinh
trung trong cac bo khac nhau
val=false;
else
val=true;
}
while(bo[++i].sodinh!=0);
return val;
}
void reset(BO b[]){ /// reset ve mac dinh cua Bo
for(int i=0;i<MAX;i++){
for(int j=0;j<MAX;j++)
bo[i].duyet[j]=0; // reset cac dinh nam trong bo thanh chua
duyet
bo[i].dem=0; // reset bien dem so phan tu da duyet cua
cac bo ve 0
}
}
void huy_dinh(MTLK &mt,int t){
for(int j=0;j<mt.dinh;j++){
mt.a[t][j]=0;
mt.a[j][t]=0;
}
}
void chuyen(stack s,MANG_CON mc[],int t){
int x,i=0;
while(!empty_stack(s)) {
pop(s,x);
mc[t].pt[i++]=x;
}
}
void laplich(BO bo[],MTLK &mt,MANG_CON mc[]) {
int v=0,t=0,temp,start=0;
stack s;
create_stack(s);
//push(s,start);
while(v<=mt.dinh) {
for(int i=0;i<MAX;i++){ /// lay dinh 0 truoc
for(int j=1;j<MAX;j++){
if(mt.a[i][j]==1 && mt.a[j][i]==1 && mt.duyet[i]==0){
/// lay 1 dinh bat ky co lk va chua duyet
push(s,i); /// bo vao stack
if(!ss(s,bo,i)) /// Neu dinh vua them vao
stack la ko dc phep
pop(s,temp); /// pop dinh do ra
else
{
v++; /// neu hop le thi tang so dinh len
mt.duyet[i]=1; /// dong thoi danh dau dinh
do da duyet => huy dinh
huy_dinh(mt,i);
break;
}}
}
}
if(!empty_stack(s)){ /// sau vong lap neu stack ko rong thi chuyen du lieu
tu stack sang mang con
chuyen(s,mc,t);
create_stack(s); /// Khoi tao lai stack
}
reset(bo); /// khoi tao lai cac bo
}}
void main()
{
tao_mtlk(mt);
tao_bo(bo);
xuat_mt(mt);
laplich(bo,mt,mc);
getch();
}

CÂY KHUNG NHỎ NHẤT

#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 20
#define MAXINT 32000
struct GRAPH
{
int n; // So dinh cua Do thi G
int a[MAX][MAX]; // Ma Tran lien ket cua G
int visited[MAX];
};
/////////////// Doc Ma Tran lien ket tu File /////////////////
void ReadGraph(GRAPH &G, char *path)
{
/// Mo file
FILE *pFile = fopen(path,"rt");
if(pFile ==NULL)
{exit(0);}
else
{
fscanf(pFile,"%d",&G.n); // Doc dinh
for(int i=0;i<G.n;i++) // Doc Ma Tran lien ket tu file
for(int j=0;j<G.n;j++)
fscanf(pFile,"%d",&G.a[i][j]);
}
fclose(pFile);
}

void Graph_null(GRAPH &T) // Gan dinh T = 0


{
for(int i=0;i<T.n;i++)
for(int j = 0;j<T.n;j++)
T.a[i][j]=0;
}

void prim(GRAPH &G, GRAPH &T)


{ int i,j;
T.n = G.n;
Graph_null(T); //Gan tat ca dinh cua T la 0
int n = 0;

for(i = 0; i<G.n; i++)


G.visited[i]=0;
G.visited [0] = 1; // Danh dau dinh 0 la da duyet

while(n<G.n -1) // So canh toi da cua cay bao trum


{int imin,jmin,emin=MAXINT;
for(i=0;i<G.n;i++) {

if(G.visited[i] ==1) { //Khi gap 1 dinh da


dc duyet thi Xet moi lien ket dinh do voi cac dinh con lai

for(j=0;j<G.n;j++)
if(G.visited[j]==0) { // Dinh chua
duyet

if(G.a[i][j]> 0 && G.a[i][j]<emin ) { //Canh


noi nho nhat giua cac dinh min
emin=G.a[i][j];
imin=i;
jmin=j;
}
}

}
T.a[imin][jmin]=1; T.a[jmin][imin]=1; //Gan vi tri cac diem
vao cay bao trum nho nhat
G.visited[jmin] = 1;
n++;
}

////////////////// In ra man hinh Ma Tran Prim ////////////////////////////


void PrintGraph(GRAPH T)
{ cout<<T.n<<endl;
for(int i=0;i<T.n;i++)
{cout<<endl;
for(int j=0;j<T.n;j++)
cout<<T.a[i][j]<<" "<<flush;
}
}

void PrintGraphByEdge(GRAPH T)
{
for(int i=0;i<T.n;i++)
for(int j=i+1;j<T.n;j++)
if(T.a[i][j]!=0)
cout<<"\n"<<i<<" -> "<<j<<flush;
}

main()
{ GRAPH G, T;
ReadGraph(G,"c:\\Kruskal3.txt");
PrintGraph(G);
prim(G,T);
PrintGraph(T);
PrintGraphByEdge(T);
getch();
}

You might also like