• 离散实验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!
    ");
     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("输入图的顶点数和边数:
    ");
     37     scanf("%d%d",&G.vnum,&G.arcnum);
     38     getchar();
     39     printf("输入图的各顶点:
    ");
     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表示):
    ");
     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("图的各顶点:
    ");
     65     for(i=1;i<=G.vnum;i++)
     66         printf("%c ",G.vexs[i]);
     67     printf("
    ");
     68     printf("图的邻接矩阵:
    ");
     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("
    ");
     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("
    ");
     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("着色方案:
    ");  
    121     trycolor(1,G);
    122     return 0;
    123 }
  • 相关阅读:
    bzoj1914
    bzoj3144
    bzoj2756
    poj3177
    一些比较水的题目
    bzoj2282
    屯题50AC纪念
    Base64解码中文部分中文乱码的原因
    随机生成36位字符串
    jQuery判断某个元素是否存在某个样式
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3416255.html
Copyright © 2020-2023  润新知