Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int **read_matrix_f(FILE *f, int *n)
  5. {
  6.     int i,j,m;
  7.     int **a;
  8.     fscanf(f,"%d",&m);
  9.  
  10.     a=(int **)malloc(m*sizeof(int*));
  11.     for(i=0;i<m;i++)
  12.     {
  13.         a[i]=(int *)malloc(m*sizeof(int));
  14.     }
  15.  
  16.     for(i=0;i<m;i++)
  17.     {
  18.         for(j=0;j<m;j++)
  19.         {
  20.            fscanf(f,"%d",&a[i][j]);
  21.         }
  22.     }
  23.  
  24.     *n=m;
  25.     return a;
  26. }
  27.  
  28. void print_matrix(int **a, int n)
  29. {
  30.     int i,j;
  31.  
  32.     for(i=0;i<n;i++)
  33.     {
  34.         for(j=0;j<n;j++)
  35.         {
  36.             printf("%3d",a[i][j]);
  37.         }
  38.         putchar('\n');
  39.     }
  40.  
  41. }
  42.  
  43. int **create_zero_matrix(int n)
  44. {
  45.     int **a;
  46.     int i,j;
  47.  
  48.     a=(int **)malloc(n*sizeof(int*));
  49.     for(i=0;i<n;i++)
  50.     {
  51.         a[i]=(int *)malloc(n*sizeof(int));
  52.     }
  53.  
  54.  
  55.     for(i=0;i<n;i++)
  56.     {
  57.         for(j=0;j<n;j++)
  58.         {
  59.            a[i][j]=0;
  60.         }
  61.     }
  62.  
  63.     return a;
  64. }
  65.  
  66. int **create_identity_matrix(int n)
  67. {
  68.     int **a;
  69.     int i,j;
  70.  
  71.     a=(int **)malloc(n*sizeof(int*));
  72.     for(i=0;i<n;i++)
  73.     {
  74.         a[i]=(int *)malloc(n*sizeof(int));
  75.     }
  76.  
  77.  
  78.     for(i=0;i<n;i++)
  79.     {
  80.         for(j=0;j<n;j++)
  81.         {
  82.            if(i==j) a[i][j]=1;
  83.            else a[i][j]=0;
  84.         }
  85.     }
  86.  
  87.     return a;
  88. }
  89.  
  90. int** matrix_add(int **a,int **b,int n)
  91. {
  92.     int **c;
  93.     int i,j;
  94.  
  95.     c=(int **)malloc(n*sizeof(int*));
  96.     for(i=0;i<n;i++)
  97.     {
  98.         c[i]=(int *)malloc(n*sizeof(int));
  99.     }
  100.  
  101.  
  102.     for(i=0;i<n;i++)
  103.     {
  104.         for(j=0;j<n;j++)
  105.         {
  106.             c[i][j]=a[i][j]+b[i][j];
  107.         }
  108.     }
  109.     return c;
  110. }
  111.  
  112. int** matrix_mult(int **a,int **b,int n)
  113. {
  114.     int **c;
  115.     int i,j,k;
  116.  
  117.     c=(int **)malloc(n*sizeof(int*));
  118.     for(i=0;i<n;i++)
  119.     {
  120.         c[i]=(int *)malloc(n*sizeof(int));
  121.     }
  122.  
  123.  
  124.     for(i=0;i<n;i++)
  125.     {
  126.         for(j=0;j<n;j++)
  127.         {
  128.             c[i][j]=0;
  129.         }
  130.     }
  131.  
  132.     for(i=0;i<n;i++)
  133.     {
  134.         for(j=0;j<n;j++)
  135.         {
  136.             for(k=0;k<n;k++)
  137.             {
  138.                 c[i][j]+=a[i][k]*b[k][j];
  139.             }
  140.         }
  141.     }
  142.  
  143.     return c;
  144. }
  145.  
  146. int raz_podgraf(int **a,int n,int **b,int m)
  147. {
  148.     if(n!=m) return 0;
  149.  
  150.     int i,j;
  151.  
  152.     for(i=0;i<n;i++)
  153.     {
  154.         for(j=0;j<n;j++)
  155.         {
  156.             if(a[i][j]==0 && b[i][j]==1) return 0;
  157.         }
  158.     }
  159.     return 1;
  160. }
  161.  
  162. int stepen_cvora(int **a,int n, int k)
  163. {
  164.     int j,count;
  165.     count=0;
  166.     for(j=0;j<n;j++)
  167.     {
  168.         count+=a[k][j];
  169.     }
  170.  
  171.     return count;
  172. }
  173.  
  174. int IJ_Walk_length_k(int **a, int n, int i, int j, int k)
  175. {
  176.     int **m,ii;
  177.  
  178.     m=create_identity_matrix(n);
  179.  
  180.     for(ii=0;ii<k;ii++)
  181.     {
  182.         m=matrix_mult(m,a,n);
  183.     }
  184.     return m[i][j];
  185. }
  186.  
  187. int IsFull(int **a,int n)
  188. {
  189.     int i,j;
  190.    
  191.     for(i=0;i<n;i++)
  192.         for(j=i+1;j<n;j++)  
  193.            if (!a[i][j]) return 0;
  194.    
  195.     return 1;
  196. }
  197.  
  198. int **MakeDistanceMatrix(int **a,int n)
  199. {
  200.     int **d=create_zero_matrix(n);
  201.     int **m=create_identity_matrix(n);
  202.    
  203.     int i,j,k;
  204.    
  205.     for(k=1;k<n;k++)
  206.     {
  207.         m=matrix_mult(m,a,n);
  208.        
  209.         for(i=0;i<n;i++)
  210.         {
  211.             for(j=i+1;j<n;j++)
  212.             {
  213.                 if(!d[i][j]&& m[i][j]) d[i][j]=d[j][i]=k;            
  214.             }            
  215.         }      
  216.         if(IsFull(d,n)) return d;      
  217.     }
  218.     return d;
  219. }
  220.  
  221. int Diameter(int **a,int n)
  222. {
  223.     int **d=MakeDistanceMatrix(a,n);
  224.    
  225.     int max=0;
  226.     int i,j;
  227.    
  228.     for(i=0;i<n;i++)
  229.        for(j=i+1;j<n;j++)
  230.           if(d[i][j]>max) max=d[i][j];
  231.  
  232.     return max;
  233. }
  234.  
  235. int IsGraphConnected (int **a,int n)
  236. {
  237.     int **b=create_zero_matrix(n);
  238.     int **m=create_identity_matrix(n);
  239.     int i,j,k;
  240.    
  241.     for(k=1;k<n;k++)
  242.     {
  243.         m=matrix_mult(m,a,n);
  244.        
  245.         for(i=0;i<n;i++)
  246.            for(j=i+1;j<n;j++)
  247.               if(!b[i][j] && m[i][j])
  248.               {
  249.                   b[i][j]=b[j][i]=1;
  250.               }
  251.         if(IsFull(b,n)) return 1;
  252.     }
  253.     return 0;
  254. }
  255.  
  256. int IsBridge(int **a,int n,int i, int j)
  257. {
  258.     if(!IsGraphConnected(a,n))
  259.     {
  260.         printf("Ne moze se ispitati da li je neka grana most jer je graf nepovezan!\n");
  261.         return -1;
  262.     }
  263.     a[i][j]=0;
  264.     a[j][i]=0;
  265.     if(IsGraphConnected(a,n)) return 0;
  266.     else return 1;
  267. }
  268.  
  269. int IsArtV(int **a,int n,int k)
  270. {
  271.     if(!IsGraphConnected(a,n))
  272.     {
  273.         printf("Ne moze se ispitati da li je neka grana most jer je graf nepovezan!\n");
  274.         return -1;
  275.     }
  276.  
  277.     int m=n-1,i,j,ii,jj;
  278.     int **b=create_zero_matrix(m);
  279.    
  280.     for(i=0;i<m;i++)
  281.        for(j=0;j<m;j++)
  282.        {
  283.            if(i<k) ii=i;
  284.            else ii=i+1;
  285.            if(j<k) jj=j;
  286.            else jj=j+1;
  287.            b[i][j]=a[ii][jj];
  288.        }
  289.  
  290.     if(IsGraphConnected(b,m)) return 0;
  291.     else return 1;
  292. }
  293.  
  294. int main(void)
  295. {
  296.     int **mat,**dist;
  297.     int n,i;
  298.     FILE *f;
  299.    
  300.     f=fopen("test2.txt","r");
  301.     mat=read_matrix_f(f,&n);
  302.     fclose(f);
  303.     print_matrix(mat,n);
  304.     putchar('\n');
  305.    
  306.     for(i=1;i<11;i++) printf("Broj setnji duzine %d od 2 do 6 je %d\n",i,IJ_Walk_length_k(mat,n,1,5,i));
  307.     putchar('\n');
  308.    
  309.     dist=MakeDistanceMatrix(mat,n);
  310.     print_matrix(dist,n);
  311.     putchar('\n');
  312.    
  313.     printf("Dijametar matrice je %d\n\n",Diameter(mat,n));
  314.    
  315.     if(IsGraphConnected(mat,n)) printf("Graf je povezan!\n\n");
  316.     else printf("Graf nije povezan!\n\n");
  317.    
  318.  /*   i=IsBridge(mat,n,0,2);
  319.     if(i==1) printf("Ovo je most!\n\n");
  320.     else if(i==0) printf("Nije most!\n\n");
  321.  */
  322.  
  323.     for(i=0;i<n;i++)
  324.     {
  325.         int k;
  326.         k=IsArtV(mat,n,i);
  327.         if(k==1) printf("%d jeste artikulacioni cvor!\n\n",i);
  328.         else if (k==0) printf("%d nije artikulacioni cvor!\n\n",i);
  329.     }              
  330.    
  331.     getchar();
  332.     return 0;
  333. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement