求解一个DAG的各个节点的b-level的C程序

来源:互联网 发布:java唤醒sleep线程 编辑:程序博客网 时间:2024/06/05 06:05

求解一个DAG的各个节点的b-level的C程序(包括求每个节点的入度和所有节点的topological sort)

 

#include <stdio.h>
#include <stdlib.h>

//不可以写与库函数同名的函数,会报错。
int main()

 int ct[3][3]={1,3,2,3,1,3,2,3,1}, cc[3][3]={1,2,4,2,1,2,4,2,1};//会涉及到一个问题,同一个core和同一种core
 int et[6][3]={1,2,4,1,3,5,2,4,5,2,3,6,1,2,3,3,5,7};
 int ec[6][3]={10,8,7,12,10,8,13,11,9,12,10,7,11,9,8,15,13,9};
 int data[6][6]={0,6,5,0,0,0,0,0,0,7,0,0,0,0,0,7,8,0,0,0,0,0,0,3,0,0,0,0,0,9,0,0,0,0,0,0};
 int admarix[6][6]={0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0};
 float c[6][6],rankup[6], w[6];
 int indegree[6]={0}, v[6];
 float sum=0, Max;
 int i,j,t,k=0,s=-1;

 

 //求每个节点的入度。
 printf("Please output the degrees of all nodes:\n ");  
  for ( i=0;i<6; i++)
       { for ( j=0;j<6; j++)
      if(data[j][i]!=0)
      indegree[i]++;
         printf("%d ", indegree[i]);
       }

    printf("\n\n");


 //接下来需要一个topological sort, 然后才能求rank数组。
    printf("Please output the inverse topological sort of all nodes:\n "); 
 
   for(i=0;i<6;i++)
    if(indegree[i]==0)
       {
         indegree[i]=s;
         s=i;
       }
    while(s!=-1)
       { 
   // printf("%d",s);
    v[k++]=s;
    // printf("v[%d]=%d ",k,s); 不可以用此语句来给数组v赋值,会出错。
          i=s;
          s=indegree[s];
          for(j=0;j<6;j++)
             {
                if(data[i][j])
                indegree[j]--;
                if(indegree[j]==0)
                   {
                      indegree[j]=s;
                      s=j;
                   }
             }
        }
  
 for ( i=0;i<6; i++)
 {
  printf("v[%d]=%d ",i, v[i]);
 }

 printf("\n\n");
 //求每个节点的平均执行时间
 for ( i=0;i<6;i++)
   {    t=0; //注意一些公用的变量的初始值的变化,叠加的话可能导致错误的结果。去掉t=0,结果就是错误的。
      for ( j=0;j<3;j++)
       t=t+et[i][j];
          w[i]=t/3.0;
   printf("w[%d]=%4.3f\n", i,w[i]);
      }


 for ( i=0;i<3; i++)
      for ( j=0;j<3; j++)
   {
      sum=sum+ct[i][j];

   }
  printf("\n sum=%4.3f\n", sum);
 
  //求每条边上的平均通信时间
 for ( i=0;i<6; i++)
     { for ( j=0;j<6; j++)
   {
    c[i][j]=sum*data[i][j]/9;
     printf("c[%d][%d]=%4.3f\n", i,j,c[i][j]);
  
   }
 printf("\n");
 }

    rankup[v[5]]=w[v[5]];
 //求每个节点的rankup。
   for ( i=5; i>=0; i--)
  {   Max=0; //注意一些公用的变量的初始值的变化,叠加的话可能导致错误的结果。去掉Max=0,结果就是错误的。
      for ( j=0;j<6;j++)
     { if (data[v[i]][j]!=0)
      if (Max<c[v[i]][j]+rankup[j])
       Max=c[v[i]][j]+rankup[j];
   }
          rankup[v[i]]=w[v[i]]+Max;
  }

   for ( i=0;i<6; i++)
     printf("rankup[%d]=%4.3f\n", i, rankup[i]);  

 system("pause");
    return 0;

}