⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ism核心代码.cpp

📁 用C语言编写的ISM算法
💻 CPP
字号:



void Cub(int p,int m,int w[N][N])//求矩阵S的p次方,结果放入矩阵w中
{
	int i,j,k,q,v[N][N];
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
			{
			    w[i][j]=S[i][j];
				v[i][j]=S[i][j];
		}
	for(q=1;q<p;q++)
	{
		for(i=0;i<m;i++)
			for(j=0;j<m;j++)
				for(k=0,w[i][j]=0;k<m;k++)
					w[i][j]+=v[i][k]*S[k][j];
		for(i=0;i<m;i++)
			for(j=0;j<m;j++)
				v[i][j]=w[i][j];
	}
}

int Comp(int m,int p[N][N],int q[N][N])//比较两个矩阵是否相等
{
	int flag=1,i,j;
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
		{
			if(p[i][j]>1)
				p[i][j]=1;
			if(q[i][j]>1)
				q[i][j]=1;
		}
	for(i=0;i<m;i++)
	  if(flag==1)
	  {
		  for(j=0;j<m;j++)
	
			if(p[i][j]!=q[i][j])
			{
				flag=0; break;
			}
	  }
	  else break;
		return flag;
}

void CompM(int m)//求可达矩阵M
{
	int i,j,k=1,s,t;
  do
	{
		Cub(k,m,s1);
		Cub(k+1,m,s2);
		Cub(k+2,m,s3);
		k++;
		s=Comp(m,s1,s2);
		t=Comp(m,s2,s3);
	}
		while(!(s==0&&t==1));
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
			M[i][j]=s2[i][j];
}



void CompAs(int m)//求先行集合As
{
    int i,j,k;
	for(i=0;i<m;i++)
	   {
	     for(j=0,k=0;j<m;j++)
			if(M[j][i]==1)
			{
				As[i][j]=j+1; k++;
			}
		}
}

void PrinM(int m,int c[N][N])//将矩阵c打印输出
{
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<m;j++)
			printf("%5d",c[i][j]);
		printf("\n");
	}
}



	
void JJ(int m,int a[N][N],int b[N][N],int c[N][N])//求矩阵a和b的交集放入矩阵c中
{
	int i,j;
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
			if(a[i][j]==b[i][j])
				c[i][j]=a[i][j];
}

void CJR(int m,int a[N][N],int d[N][N],int c[N][N])//求层级关系,n代表层数
{
	int i,j,n,b,f;
	Ini(m,c);
    for(n=0;Equ(m,a,In)==0;n++)
		{ 
			for(i=0,b=0;i<m;i++)
			 if((LineC(a,i,m)==0)) 	
			{
				for(j=0;j<m;j++)
				  if(a[i][j]!=d[i][j])
					  break;
				  if(j==m)  { c[n][b]=i+1;   b++;}
             }
			for(f=0;f<b;f++)
				for(i=0;i<m;i++)
					if((i+1)==c[n][f])
						for(j=0;j<m;j++)
						{
							a[j][i]=0;
                            d[j][i]=0;
						}
   }
	printf("\n最后求得的层级关系如下:\n");
   for(i=0;i<n;i++)
   {
	   for(j=0;c[i][j]!=0;j++)
		   printf("%5d",c[i][j]);
	   printf("\n");
   }
}



void Zo(int m,int b)
{
	int i,j,n,f,Zo[N][N],Rs1[N][N],RsEqAs1[N][N];
    Ini(m,Zo);
	for(i=0;i<b;i++)
	   {
		   n=Bo[i]-1;
	     for(j=0;j<m;j++)
			 Zo[n][j]=Rs[n][j];
	   }
		 printf("进行比较前的区域情况:\n");
		 PrinM(m,Zo);
	   for(i=0;i<m;i++)
		   for(j=i+1;j<m;j++)
			   if(LineC(Zo,i,m)==0&&LineC(Zo,j,m)==0)
				   for(f=0;f<m;f++)
					   if(Zo[i][f]==Zo[j][f])
					   {
						   for(n=0;n<m;n++)
							   if(Zo[i][n]==0)
								   Zo[i][n]=Zo[j][n];
						   for(n=0;n<m;n++)
							   Zo[j][n]=0;
						   break;
					   }
	    printf("进行比较后的区域情况:\n");
		 PrinM(m,Zo);
     for(i=0;i<m;i++)
		   if(LineC(Zo,i,m)==0) 
		   {
			   Ini(m,Rs1);
			   Ini(m,RsEqAs1);
		     for(j=0;j<m;j++)
				 if(Zo[i][j]!=0)
				 {
					 f=Zo[i][j]-1;
					 for(b=0;b<m;b++)
					 {
						 Rs1[f][b]=Rs[f][b];
					     RsEqAs1[f][b]=RsEqAs[f][b];
					 }
				 }
			CJR(m,Rs1,RsEqAs1,CJ);
		   }
}	


void main()
{
	int b,m;
	printf("请输入矩阵的行数(最多不超过100):\n");
	scanf("%d",&m);
	InA(m);//从键盘输入邻接矩阵A
	printf("邻接矩阵A为:\n");
	PrinM(m,A);//在屏幕上输出矩阵A
	IniI(m);//求单位矩阵I
	printf("单位矩阵I为:\n");
	PrinM(m,I);//在屏幕上输出单位矩阵I
	CompS(m);//求矩阵A和I的和S
	printf("A+I的和S为:\n");
	PrinM(m,S);//在屏幕上输出矩阵S
	CompM(m);//求可达矩阵M
	printf("求得可达矩阵M为:\n");
	PrinM(m,M);//在屏幕上输出可达矩阵M
	Ini(m,Rs);//初始化可达集合矩阵Rs,先行集合矩阵As,可达集合和先行集合的交集RsEqAs,先行集合和交集的交集AEs
	Ini(m,As);
	Ini(m,RsEqAs);
	Ini(m,AEs);
	CompRs(m);//求可达集合Rs
	printf("可达集合的矩阵为:\n");    
	PrinM(m,Rs);
    CompAs(m);//求先行集合As
	printf("先行集合为:\n");
	PrinM(m,As);
    JJ(m,Rs,As,RsEqAs);//求可达集合与先行集合的交集
    printf("可达集合与先行集合的交集为:\n");
	PrinM(m,RsEqAs);
	Ini(m,CJ);
	Ini(m,In);
	printf("最底层元素为:\n");
    b=SeB(m);//寻找最底层元素
   if(b==1)    CJR(m,Rs,RsEqAs,CJ);
   else     Zo(m,b);
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -