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