//矩阵的相乘运算
#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;
}
}