离散实验4

  1 #include<iostream>
  2 #include <iomanip>
  3 #include<string>
  4 using namespace std;
  5 
  6 int main()
  7 {
  8     int i, j;
  9     string C, R;
 10     cout << "输入集合:" << endl;
 11     cin >> C;
 12     cout << "关系:" << endl;
 13     cin >> R;
 14 
 15     string setA;
 16     int D = 0;
 17     for (i = 0; i < C.length();i++)
 18         if (C[i]>'a' && C[i] < 'z')
 19         {
 20             setA += C[i];
 21             D++;
 22         }
 23         string *CA = new string[D * 2];
 24         for (i = 0; i < D; i++)
 25             CA[i] = setA[i];
 26         string RA;
 27         for (i = 0; i < R.length(); i++)
 28             if (R[i]>'a' && R[i] < 'z')
 29                 RA += R[i];
 30         int **M = new int*[D];
 31         for (i = 0; i < D; i++)
 32             M[i] = new int[D];
 33         
 34         for (i = 0; i < D; i++)
 35             for (j = 0; j < D; j++)
 36                 M[i][j] = 0;
 37         for (i = 0; i < RA.length(); i += 2)
 38             M[RA[i] - 'a'][RA[i + 1] - 'a'] = 1;
 39         cout << "矩阵:" << endl;
 40 
 41         for (i = 0; i < D; i++)
 42             for (j = 0; j < D; j++)
 43             {
 44                 cout << M[i][j] << " ";
 45                 if (j == D - 1)
 46                     cout <<endl;
 47             }
 48             cout << endl;
 49 
 50             cout << "简化矩阵" << endl;
 51 
 52             for (i = 1; i < D; i++)
 53                 for (j = 0; j < i; j++)
 54                 {
 55                     cout << M[i][j] << " ";
 56                     if (j == i - 1)
 57                         cout << endl;
 58                 }
 59                 cout << endl;
 60 
 61                 if (D == 1)
 62                 {
 63                     cout << "该关系极大相容类:" << endl;
 64                     return 0;
 65                 }
 66 
 67                 int DA =D,DB = D;
 68                 string strA, strB, strC;
 69                 if (D > 1)
 70                 {
 71                     for (i = DB - 2; i >= 0; i--)
 72                     {
 73                         for (j = i + 1; j < DB; j++)
 74                             if (M[j][i] == 1)
 75                                 strA += char('a' + j);
 76                         for (j = 0; j < D; j++)
 77                         {
 78                             for (int k = 0; k < CA[j].length(); k++)
 79                                 for (int m = 0; m < strA.length();m++)
 80                                 if (CA[j][k] == strA[m])
 81                                     strB += strA[m];
 82 
 83                             if (strB.length() != 0)
 84                             {
 85                                 strC = strB;
 86                                 strB = char('a' + 1);
 87                                 strB += strC;
 88                                 CA[DA] = strB;
 89                                 DA++;
 90                                 strC = " ";
 91                                 strB = " ";
 92                             }
 93                         }
 94                         strA = " ";
 95                         D = DA;
 96                         int flag = 0;
 97                         for (j = 0; j < D; j++)
 98                             for (int k = j + 1; k < D; k++)
 99                             {
100                                 for (int l = 0; l < CA[j].length(); l++)
101                                     for (int  m = 0; m < CA[k].length(); m++)
102                                         if (CA[j][l] == CA[k][m])
103                                             flag++;
104                                 if (flag != 0 && flag == CA[j].length())
105                                 {
106                                     CA[j] = " ";
107                                     DA--;
108                                 }
109                                 if (flag != 0 && flag == CA[k].length())
110                                 {
111                                     CA[k] = " ";
112                                     DA--;
113                                 }
114                                 flag = 0;
115                             }
116                             for (j = 0; j < D; j++)
117                                 for (int k = 0; k < D - 1; k++)
118                                     if (CA[k] == " " && CA[k + 1] != " ")
119                                     {
120                                         CA[k] = CA[k + 1];
121                                         CA[k + 1] = " ";
122                                     }
123                                     for (j = 0; j < D; j++)
124                                         cout << setw(5) << CA[j];
125                                     cout << endl;
126                     }
127                 }
128                 cout << endl;
129                 cout << "极大相容类:" << endl;
130                 for (i = 0; i < D; i++)
131                 {
132                     cout << "{";
133                     for (j = 0; j < CA[i].length(); j++)
134                     {
135                         cout << CA[i][j];
136                         if (j != CA[i].length() - 1)
137                             cout << ",";
138                     }
139                     cout << "}";
140                     if (i != D - 1)
141                         cout << ",";
142                 }
143                 cout << endl;
144                 return 0;
145 
146 }

 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define MAXedg 100
  4 #define MAX 0
  5 #define N 4  //着色的颜色数
  6 int color[30]={0};//来存储对应块的对应颜色
  7 typedef char vextype;
  8 typedef int adjtype;
  9 typedef struct     //定义图
 10 {
 11     vextype vexs[MAXedg];  //存放边的矩阵
 12     adjtype arcs[MAXedg][MAXedg];  //图的邻接矩阵
 13     int vnum,arcnum;     //图的顶点数和边数
 14 }Graph;
 15 //***********************************************************
 16 int LocateVex(Graph G,char u)
 17 { 
 18     int i;
 19     for(i=1;i<=G.vnum;i++)
 20     { 
 21        if(u==G.vexs[i]) 
 22        return i;
 23     }
 24     if(i==G.vnum) 
 25    {  
 26       printf("Error u!\n");
 27       exit(1);
 28    }
 29    return 0;
 30 }
 31 //**********************************************************
 32 void CreateGraph(Graph &G)   //输入图
 33 {
 34     int i,j,k, w;
 35     vextype v1,v2;
 36     printf("输入图的顶点数和边数:\n");
 37     scanf("%d%d",&G.vnum,&G.arcnum);
 38     getchar();
 39     printf("输入图的各顶点:\n");
 40     for(i=1;i<=G.vnum;i++)
 41     {
 42         scanf("%c",&G.vexs[i]); 
 43         getchar();
 44     } 
 45     for(i=0;i<=G.vnum;i++)
 46     for(j=0;j<=G.vnum;j++)
 47     G.arcs[i][j]=MAX;
 48     printf("输入边的两个顶点和权值(均用1表示):\n");
 49     for(k=0;k<G.arcnum;k++)
 50     {
 51         scanf("%c", &v1);getchar();
 52         scanf("%c", &v2);getchar();
 53         scanf("%d", &w); getchar();  
 54         i=LocateVex(G,v1);
 55         j=LocateVex(G,v2);
 56         G.arcs[i][j]=w;
 57         G.arcs[j][i]=w;
 58     }
 59 }
 60 //****************************************************************
 61 void PrintGraph(Graph G)   //输出图的信息
 62 {
 63     int i,j;
 64     printf("图的各顶点:\n");
 65     for(i=1;i<=G.vnum;i++)
 66         printf("%c ",G.vexs[i]);
 67     printf("\n");
 68     printf("图的邻接矩阵:\n");
 69  for(i=1;i<=G.vnum;i++)
 70  {
 71      for(j=1;j<=G.vnum;j++)
 72      printf("%d  ",G.arcs[i][j]);
 73      printf("\n");
 74  }
 75 }
 76 //******************************************************************
 77 int colorsame(int s,Graph G)//判断这个颜色能不能满足要求
 78 {
 79     int i,flag=0;
 80     for(i=1;i<=s-1;i++)//分别与前面已经着色的几块比较
 81         if(G.arcs[i][s]==1&&color[i]==color[s])
 82         {
 83       flag=1;break;
 84     }
 85     return flag;
 86 }
 87 //******************************************************************
 88 void output(Graph G)//输出函数
 89 {
 90     int i;
 91     for(i=1;i<=G.vnum;i++)
 92         printf("%d ",color[i]);
 93     printf("\n");
 94 }
 95 //******************************************************************
 96 void trycolor(int s,Graph G)//s为开始图色的顶点,本算法从1开始
 97 {
 98     int i;
 99     if(s>G.vnum)//递归出口
100     {
101         output(G);
102         exit(1);
103     }
104     else
105     {
106         for(i=1;i<=N;i++)//对每一种色彩逐个测试
107         {
108             color[s]=i;
109             if(colorsame(s,G)==0)
110                 trycolor(s+1,G);//进行下一块的着色
111         }
112     }
113 }
114 //*****************************************************************
115 int main()
116 { 
117     Graph G;
118     CreateGraph(G);
119     PrintGraph(G);
120     printf("着色方案:\n");  
121     trycolor(1,G);
122     return 0;
123 }

 

posted @ 2013-11-09 23:49  herizai007  阅读(234)  评论(0编辑  收藏  举报