#include<iostream>
#include<iomanip>
#include <fstream>
#define cin fin
#define MAX_VEXNUM 101 //最大顶点数
using namespace std;
ifstream fin("data.in");
const int infinity = INT_MAX; //代表无穷大
//--------------顶点的类定义---------------------
class Vertex
{
private:
int vertexname; //顶点名称
int Yu; //神经元阈值
int Statu; //神经元状态
public:
Vertex(int v1=0, int y=0, int s=0):
vertexname(v1), Yu(y), Statu(s){}
int getVertexName() { //返回顶点名称
return vertexname;
}
void setVertexName(int name) {
vertexname = name;
}
void setYu(int y) {
Yu = y;
}
void setStatu(int s) {
Statu = s;
}
int getVertexYu() { //返回顶点阈值
return Yu;
}
int getVertexStatu() { //返回顶点名称
return Statu;
}
};
//---------------------邻接矩阵存储图---------------------------
template<class VertexType, class EdgeType>
class Gragh_Matrix
{
private:
VertexType vexs[MAX_VEXNUM]; //顶点表数组
EdgeType edges[MAX_VEXNUM][MAX_VEXNUM]; //邻接矩阵!
int vNum; //顶点数
int eNum; //边数
bool visited[MAX_VEXNUM]; //标记数组
public:
Gragh_Matrix();
~Gragh_Matrix(){}
bool CreatMGragh(); //建立有向网络图的邻接存储结构
void DisplayMGragh(); //输出邻接矩阵
int GetVertexName(const int i) {return (this->vexs[i]).getVertexName();} //获取顶点名称
int GetVertexIndex(const int vertexName); //获取顶点在图(数组)中的位置
bool IsVertexExist(int v1); //判断该顶点是否存储在图中
int VertexOD(const int vertexname); //出度
void CalAllStatu(); //计算所有节点状态
void OutStatu(); //输出输出层处于兴奋状态的神经元
};
//------------------构造函数------------------------
template<class VertexType, class EdgeType>
Gragh_Matrix<VertexType, EdgeType>::Gragh_Matrix()
{
this->eNum = 0;
this->vNum = 0;
};
//-----------------创建邻接矩阵存储图---------------
template<class VertexType, class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::CreatMGragh()
{
int i, j,k;
int S, Y;
//cout<<"请输入神经元数目N(有向图节点数)和P(有向图边数目):"<<endl;
cin>>this->vNum>>this->eNum;
for (i=0; i<vNum; i++)
{
//cout<<"请输入第"<<i+1<<"个顶点的初始状态和阈值:";
cin>>S>>Y;
vexs[i].setVertexName(i+1);
vexs[i].setStatu(S);
vexs[i].setYu(Y);
}
for (i=0; i<vNum; i++) //初始化邻接矩阵
{
for (j=0; j<vNum; j++)
{
edges[i][j] = infinity;
}
}
int v1, v2;
EdgeType w;
for (k=0; k<eNum; k++)
{
//cout<<"请输入第"<<k+1<<"条边的起点、终点、权值:";
cin>>v1>>v2>>w;
int m = GetVertexIndex(v1);
int n = GetVertexIndex(v2);
edges[m][n] = w;
}
return true;
}
//---------------获取顶点在图(顶点表)中的位置---------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::GetVertexIndex(const int vertexName)
{
for (int index=0; index != vNum; ++index)
{
if(vertexName == GetVertexName(index))
return index;
}
return -1;
}
//---------------判断图中是否存在顶点v1---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::IsVertexExist(int v1)
{
int i = GetVertexIndex(v1);
if(i == -1) return false;
else return true;
}
//--------------计算顶点出度---------------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::VertexOD(const int vertexname)
{
if (!IsVertexExist(vertexname))
{
return -1;
}
int v = GetVertexIndex(vertexname); //元素V在邻接矩阵中的行数
int OD = 0;
for (int i=0; i<vNum; ++i)
{
if (edges[v][i] != infinity) //邻接矩阵中该行的"元素数"即该顶点的出度
++OD;
}
return OD;
}
//---------------------计算所有节点状态-----------------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::CalAllStatu()
{
int record;
for (int i = 0; i<vNum; ++i) //i代表列
{
bool Conver = false; //判断该神经元是否受上一级神经元所影响
record = vexs[i].getVertexStatu(); //record 记录vexs[i]节点的初始状态 非输入层开始都为零
for (int j=0; j<vNum; ++j) //j代表行
{
if (edges[j][i] != infinity && vexs[j].getVertexStatu() > 0)
{
record += vexs[j].getVertexStatu() * edges[j][i]; //vexs[j]即为链接vexs[i]的前一个节点
Conver = true;
}
}
if (Conver)
{
record = record - vexs[i].getVertexYu();
vexs[i].setStatu(record);
}
}
}
//------------------------(按顺序)输出(活跃的)输出层状态--------------------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::OutStatu()
{
int i;
bool flag = false;
for (i=0; i<vNum; ++i)
{
if ( (vexs[i].getVertexStatu() > 0) && (VertexOD(i+1) == 0) )
{
cout<< i+1 <<" "<< vexs[i].getVertexStatu() <<endl;
flag = true;
}
}
if (!flag)
{
cout<<"NULL"<<endl;
}
}
//---------------主函数--------------------------
#include "Gragh_Matrix.h"
#include <Ctime>
int main()
{
time_t start=clock();
Gragh_Matrix<Vertex, int> G;
G.CreatMGragh(); //创建图
G.CalAllStatu(); //计算全部神经元的状态
G.OutStatu(); //输出输出层处于兴奋状态的节点
time_t end=clock();
double t=difftime(end,start);
cout <<"耗时:"<< t <<" MS."<< endl;
system("pause");
return 0;
}