离散最近学习了集合论

 //矩阵的相乘运算
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

void main ()
{
 int i;
 int j;
 int size;
 int count;
 
 cout << "请输入矩阵的大小:" << endl;
 cin >> size;

 vector<vector<int> > arrayA(size, vector<int>(size));
 vector<vector<int> > arrayB(size, vector<int>(size));
 vector<vector<int> > arrayPro(size, vector<int>(size));

 //从文件读入到数组arrayA,arrayB中
 ifstream finA ("e://testA.txt", ios::in);
 ifstream finB ("e://testB.txt", ios::in);
 if(!finA || !finB)
  cout << "ERROR!" << endl;
 else
 {
  for (i = 0; i < 5; i++)
   for (j = 0; j < 5; j++)
    finA >> arrayA[i][j];
  for (i = 0; i < 5; i++)
   for (j = 0; j < 5; j++)
    finB >> arrayB[i][j];
 }
 finA.close();
 finB.close();

 cout << "A矩阵:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << arrayA[i][j] << ' ';
  cout << endl;
 }
 cout << "B矩阵:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << arrayB[i][j] << ' ';
  cout << endl;
 }

 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
   arrayPro[i][j] = 0;
 //矩阵相乘的过程
 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   for (count = 0; count < size; count++)
    arrayPro[i][j] += arrayA[i][count]*arrayB[count][j];
  }

 cout << "A和B矩阵相乘的矩阵:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << arrayPro[i][j] << ' ';
  cout << endl;
 }

 //把结果写入文件中
 ofstream fout ("e://ans.txt", ios::out);
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   fout << arrayPro[i][j] << " ";
  fout << "/n";
 }
}

 

 

#include <iostream.h>
//关系图用邻接表存储(还有一点问题 )

const int MAX_VERTEX_NUM = 10;

struct ArcNode
{
 int adjvex; //邻接顶点
 ArcNode * nextArc;
};

struct VNode
{
 char data;
 ArcNode * firstArc;
};

struct ALGraph
{
 VNode vexs[MAX_VERTEX_NUM];
 int vexnum;
 int arcnum;
};

int LocateVex (ALGraph G, char v)
{
 int i;
 for (i = 0; i < G.vexnum; i++)
  if (G.vexs[i].data == v)
   return i;
 return -1;
}

void Create (ALGraph & G)
{
 int i;
 int j;
 int k;
 char v1;
 char v2;
 ArcNode * p;

 cout << "请输入顶点的个数:" << endl;
 cin >> G.vexnum;
 cout << "请输入弧的个数:" << endl;
 cin >> G.arcnum;

 
 cout << "请输入各顶点的字符:" << endl;
 for (i = 0; i < G.vexnum; i++)
 {
  cout << "第" << i+1 << "个顶点:";
  cin >> G.vexs[i].data;
  G.vexs[i].firstArc = NULL;
 }

 cout << "请输入各序偶:" << endl;//输入了各序偶,通过邻接表存储
 for (k = 0; k < G.arcnum; k++)
 {
  cout << "第" << k+1 << "个序偶" << endl;
  cout << "第一元素:";
  cin >> v1;
  cout << "第二元素:";
  cin >> v2;
 
  i = LocateVex (G, v1);
  j = LocateVex (G, v2);
  if (i != -1 && j != -1)
  {
   p = new ArcNode;
   p->adjvex = j;
   p->nextArc = G.vexs[i].firstArc;
   G.vexs[i].firstArc = p;   
  }  
 }
}

//复合运算的函数
void Complex (ALGraph G1, ALGraph G2, ALGraph & G)//G为运算的结果
{
 ArcNode * p, * q, * m;
 int i;
 int k;
 
 G.vexnum = G1.vexnum;
 for (i = 0; i < G1.vexnum; i++)
  G.vexs[i].data = G1.vexs[i].data;//G1和G2中的元素字符相同
 for (k = 0; k < G.vexnum; k++)
 {
  p = G1.vexs[k].firstArc;
  while (p != NULL)
  {
   q = G2.vexs[p->adjvex].firstArc;
   while (q != NULL)
   {
    m = new ArcNode;
    m->adjvex = q->adjvex;
    m->nextArc = G.vexs[k].firstArc;
    G.vexs[k].firstArc = m;
    q = q->nextArc;
   }
   p = p->nextArc;
  }
 }
}

void OutPut (ALGraph G)
{
 ArcNode * p;
 int i;

 cout << "集合中的序偶:" << endl;
 for (i = 0; i < G.vexnum; i++)
 {
  p = G.vexs[i].firstArc;
  while (p != NULL)
  {
   cout << "(" << G.vexs[i].data << ","<< G.vexs[p->adjvex].data << ")" << endl;
   p = p->nextArc;
  }
 }
}

void main ()
{
 ALGraph G1, G2;
 ALGraph G;

 cout << "G1:" << endl;
 Create (G1);
 cout << "G2:" << endl;
 Create (G2);
 Complex (G1, G2, G);

 cout << "G1";
 OutPut(G1);
 cout << "G2";
 OutPut(G2);
 cout << "G1和G2复合后的序偶集合:";
 OutPut(G);
}


//Warshall算法

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

void main ()
{
 int i;
 int j;
 int count;
 int size;

 cout << "请输入矩阵的大小:" << endl;
 cin >> size;
 
 vector<vector<int> > array (size, vector<int>(size));
 vector<vector<int> > ans (size, vector<int>(size));

 ifstream fin ("e://test.txt", ios::in);
 if (!fin)
  cout << "ERROR!" << endl;
 else
 {
  for (i = 0; i < size; i++)
   for (j = 0; j < size; j++)
    fin >> array[i][j];
 }
 fin.close();

 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << array[i][j] << ' ';
  cout << endl;
 }
 cout << endl;

 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   ans[i][j] = 0;
 }

 for (j = 0; j < size; j++)
  for (i = 0; i < size; i++)
  {
   if (array[i][j] == 1)//如果第i行的元素为1
   {
    for (count = 0; count < size; count++)//将第i行的元素与第j列的元素进行逻辑加
    {
     if (array[count][j] == 1 || array[i][count] == 1)
      ans[i][count] = 1;
    } 
   }
  }


 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << ans[i][j] << ' ';
  cout << endl;
 }
}

 

 

/*//栈数组
#include <iostream.h>

void main ()
{
 const int size = 5;
 int A[size][size];
 int B[size][size];
 int C[size][size];
 int i;
 int j;
 bool mark;

 cout << "请输入A矩阵所有序偶的集合(结束时请输入(-1,-1)):" << endl;
 while (i != -1 && j != -1)
 {
  cin >> i >> j;
  if (i >= 1 && j >= 1)
   A[i-1][j-1] = 1;
 }
 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   if (A[i][j] != 1)
    A[i][j] = 0;
  }

 cout << "请输入B矩阵所有序偶的集合(结束时请输入(-1,-1)):" << endl;
 while (i != -1 && j != -1)
 {
  cin >> i >> j;
  if (i >= 1 && j >= 1)
   B[i-1][j-1] = 1;
 }
 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   if (B[i][j] != 1)
    B[i][j] = 0;
  }

 cout << "A矩阵为:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << A[i][j] << '/t';
  cout << endl;
 }
 cout << endl;
 cout << "B矩阵为:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << B[i][j] << '/t';
  cout << endl;
 }
 cout << endl;

 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   mark = false;
   for (int count = 0; count < size; count++)
   {
    if (A[i][count] == 1 && B[count][j] == 1)
    {
     C[i][j] = 1;
     mark = true;
     break;
    }
    else 
     C[i][j] = 0;    
   }
  }
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << C[i][j] << '/t';
  cout << endl;
 }
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   if (C[i][j] == 1)
    cout << "(" << i+1 << "," << j+1 << ")" << endl; 
 }
}*/

//堆数组
#include <iostream>
#include <vector>
using namespace std;

void main()
{
 int i=0;    //行下标
 int j=0;    //列下标
 int size;   //矩阵大小
 bool mark;  //判断的标记值

 cout << "请输入两个矩阵的大小:";
 cin >> size;
 
 vector<vector<int> > A(size, vector<int>(size));
 vector<vector<int> > B(size, vector<int>(size));
 vector<vector<int> > C(size, vector<int>(size));
 
 //由于c++中下标从零开始,与平时的思维有一点出入,多以此处要将下标减去1才是矩阵的下标
 cout << "请输入A矩阵所有序偶的集合(结束时请输入(-1,-1)):" << endl;
 while (i != -1 && j != -1)
 {
  cin >> i >> j;
  if (i >= 1 && j >= 1)
   A[i-1][j-1] = 1;
 }
 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   if (A[i][j] != 1)
    A[i][j] = 0;
  }

 cout << "请输入B矩阵所有序偶的集合(结束时请输入(-1,-1)):" << endl;
 while (i != -1 && j != -1)
 {
  cin >> i >> j;
  if (i >= 1 && j >= 1)
   B[i-1][j-1] = 1;
 }
 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   if (B[i][j] != 1)
    B[i][j] = 0;
  }

 //打印A矩阵及存在的序偶
 cout << "A矩阵为:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << A[i][j] << '/t';
  cout << endl;
 }
 cout << endl;
 cout << "A矩阵中的序偶为:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   if (A[i][j] == 1)
    cout << "(" << i+1 << "," << j+1 << ")" << endl; 
 }

 //打印B矩阵及存在的序偶
 cout << "B矩阵为:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout << B[i][j] << '/t';
  cout << endl;
 }
 cout << endl;
 cout << "B矩阵中的序偶为:" << endl;
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   if (B[i][j] == 1)
    cout << "(" << i+1 << "," << j+1 << ")" << endl; 
 }

 //计算得到C(=A*B)矩阵
 for (i = 0; i < size; i++)
  for (j = 0; j < size; j++)
  {
   mark = false;//标记值记为false
   for (int count = 0; count < size; count++)
   {
    if (A[i][count] == 1 && B[count][j] == 1)
    {
     C[i][j] = 1;//两者都为1,说明能够传递且复合后存在(i-1,j-1)
     mark = true;
     break;
    }
    else 
     C[i][j] = 0;
   }
  }

 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   cout<< C[i][j] << '/t';
  cout << endl;
 }

 //打印C矩阵中存在的序偶
 for (i = 0; i < size; i++)
 {
  for (j = 0; j < size; j++)
   if (C[i][j] == 1)
    cout << "(" << i+1 << "," << j+1 << ")" << endl; 
 }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值