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

求解一个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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值