#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define MAX_VERTEX_NUM 6
typedef int* Type;
typedef int Status;
//邻接矩阵
typedef struct ArcCell{
int adj;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//每个十进制数转换四位二进制
void convert(char* num,Type &stuNo){
int i,j,k,t;
int length = strlen(num);
for(i = 0;i<length;i++){
t = num[i]-'0'; //将字符变成数字
k = 0;
for(j=3; j>=0; j--){
stuNo[4*i+k] = (t>>j)&1;
k++;
}
}
}
void ReachableMatrix(Type stuNo,AdjMatrix &A,AdjMatrix &G){
int i,j,k,n;
int m = 0;
AdjMatrix An,Bn; // An,Bn交替求矩阵的幂
//邻接矩阵初始化
for(i=0;i<MAX_VERTEX_NUM;i++){
for(j=0;j<MAX_VERTEX_NUM;j++){
A[i][j].adj = stuNo[m];
An[i][j].adj = stuNo[m];
G[i][j].adj = stuNo[m];
m++;
}
}
//求可达矩阵
for(k = 2;k<=MAX_VERTEX_NUM;k++){
if(k%2==0){
for(i = 0;i<MAX_VERTEX_NUM;i++){
for(j = 0;j<MAX_VERTEX_NUM;j++){
Bn[i][j].adj = 0;
for(n=0;n<MAX_VERTEX_NUM;n++) Bn[i][j].adj += A[i][k].adj * An[k][j].adj;
G[i][j].adj += Bn[i][j].adj;
}
}
}else{
for(i = 0;i<MAX_VERTEX_NUM;i++){
for(j = 0;j<MAX_VERTEX_NUM;j++){
An[i][j].adj = 0;
for(n=0;n<MAX_VERTEX_NUM;n++) An[i][j].adj += A[i][k].adj * Bn[k][j].adj;
G[i][j].adj += An[i][j].adj;
}
}
}
}
}
//强连通图
Status StrongCon(AdjMatrix G){
int i,j;
for(i=0;i<MAX_VERTEX_NUM;i++){
for(j=0;j<MAX_VERTEX_NUM;j++){
if(G[i][j].adj==0) return FALSE;
}
}
return TRUE;
}
//单侧连通图
Status SingleCon(AdjMatrix G){
int i,j;
for(i=0;i<MAX_VERTEX_NUM;i++){
for(j=0;j<i;j++){
if(!(G[i][j].adj || G[j][i].adj)) return FALSE;
}
}
return TRUE;
}
//弱连通图
Status WeaklyCon(AdjMatrix G){
int i,j,k;
for(i=0;i<MAX_VERTEX_NUM;i++){
for(j=0;j<MAX_VERTEX_NUM;j++){
if(G[i][j].adj) break;
}
if(j==MAX_VERTEX_NUM){
for(k=0;k<MAX_VERTEX_NUM;k++){
if(G[k][i].adj) break;
}
if(k==MAX_VERTEX_NUM) return FALSE;
}
}
return TRUE;
}
int main(){
int i,j,k=0;
char a[12] = "20172430112"; //学号字符数组
Type stuNo;
AdjMatrix arcs; //邻接矩阵
AdjMatrix G; //可达矩阵
stuNo = (Type)malloc(44*sizeof(int));
convert(a,stuNo);
ReachableMatrix(stuNo,arcs,G);
if(StrongCon(G)){
printf("该图是强连通图");
}else if(SingleCon(arcs)){
printf("该图是单侧连通图");
}else if(WeaklyCon(arcs)){
printf("该图是弱连通图");
}else{
printf("该图不是强连通图,不是单侧连通图,不是弱连通图");
}
return 0;
}