哪个高手给救一下,十分感谢。

licrosoftyzb 2006-06-25 11:25:51
求关键路径
  设有一个工程网络如下图表示(无环路的有向图):
  其中,顶点表示活动,①表示工程开始,⑤表示工程结束(可变,用N表示),边上的数字表示活动延续的时间。

  如上图中,活动①开始5天后活动②才能开始工作,而活动③则要等①、②完成之后才能开始,即最早也要7天后才能工作。
  在工程网络中,延续时间最长的路径称为关键路径。上图中的关键路径为:①—②—③—④—⑤共18天完成。
关键路径的算法如下:
1.数据结构:
数组 R   表示活动的延续时间,若无连线,则用-1表示;
   EET  表示活动最早可以开始的时间
   ET   表示活动最迟应该开始的时间
  关键路径通过点J,具有如下的性质:EET(J)=ET(J)
2.约定:
 结点的排列已经过拓扑排序,即序号前面的结点会影响序号后面结点的活动。
附参考程序清单(basic)
 10 DIM R(20,20),EET(20),ET(20)
 20 INPUT N
 30 FOR I=1 TO N
 40 FOR J=1 TO N
 50 R(I,J)=-1
 60 NEXT J,I
 70 INPUT X,Y,W
 80 IF X=0 THEN 110
 90 R(X,Y)=W
 100  ① 
 110 EET(1)=0
 120 FOR I=2 TO N
 130 MAX=0
 140 FOR J=1 TO N
 150 IF(R(J,I)〈 〉-1)AND ② THEN MAX=R(J,I)+EET(J)
 160 NEXT J:EET(I)=MAX
 170 NEXT I
 180  ③ 
 190 FOR I=N -1 TO 1 STEP -1
 200 MIN=10000
 210 FOR J=1 TO N
 220 IF(R(I,J)〈 〉 -1) AND  ④  THEN MIN=ET(J)-R(I,J)
 230 NEXT J
 240 ET(I)=MIN
 250 NEXT I
 260 PRINT EET(N)
 270 FOR I=1 TO N -1
 280 IF  ⑤  THEN PRINT I;“--->”;
 290 NEXT I: PRINT N
 300 END
我连题目都看不懂,谢谢各位啊,帮帮忙~
...全文
239 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
我啃 2006-06-27
  • 打赏
  • 举报
回复
明明是QB的我来作死改改,不通过编译器了语法改改
10 DIM R(20,20),EET(20),ET(20)
 20 INPUT N
 30 FOR I=1 TO N
 40 FOR J=1 TO N
 50 R(I,J)=-1
 60 NEXT J,I
 70 INPUT X,Y,W
 80 IF X=0 THEN 110
 90 R(X,Y)=W
 100 GOTO 70
 110 EET(1)=0
 120 FOR I=2 TO N
 130 MAX=0
 140 FOR J=1 TO N
 150 IF(R(J,I)〈 〉-1)AND R(J,I)+EET(J)>MAX THEN MAX=R(J,I)+EET(J)
 160 NEXT J:EET(I)=MAX
 170 NEXT I
 180 ET(N)=EET(N) 
190 FOR I=N -1 TO 1 STEP -1
 200 MIN=10000
 210 FOR J=1 TO N
 220 IF(R(I,J)〈 〉 -1) AND ET(J) -R(I,J)<MIN THEN MIN=ET(J)-R(I,J)
 230 NEXT J
 240 ET(I)=MIN
 250 NEXT I
 260 PRINT EET(N)
 270 FOR I=1 TO N -1
 280 IF EET(I)=ET(I) THEN PRINT I;“--->”;
 290 NEXT I: PRINT N
 300 END

int r[21][21],eet[21],et[21];//方便一点
int n,i,j;
int x,y,w;
int max,min;
scanf("%d\n",&n);//输入
for (i=1;i<=n;i++)//初始化
for (j=1;d<=n;j++)
r[i][j] = -1;
while (1)
{
scanf("%d %d %d\n",&x,&y,&w);//输入
if (x==0) //语义有点改动
break;
r[x][y]=w;
}
eet[1]=0;
for (i=2;i<=n;i++)
{
max=0;
for (j=1;j<=n;j++)
if (r[j][i]!=-1&&r[j][i]+eet[j]>max)
max = r[j][i]+eet[j]
eet[i]=max
}
et[n]=eet[n]
for (i=n-1;i>=1;i--)
{
min=10000;
for (j=1;j<=n;j++)
if (r[i][j]!=-1&&et[j]-r[i][j]<min)
min = et[j]-r[i][j]

et[i]=min;
}
printf("%d\n",eet[n]);
for (i=0;i<=n-1;i++)
if (eet[i]==et[i])
printf("%d --->",i);
printf("%d\n",n);
一个大概而已
licrosoftyzb 2006-06-27
  • 打赏
  • 举报
回复
我已经把空填好了,希望哪位懂BASIC和C的大虾救一下,改成C的,谢谢了,鞠躬,作揖~
10 DIM R(20,20),EET(20),ET(20)
 20 INPUT N
 30 FOR I=1 TO N
 40 FOR J=1 TO N
 50 R(I,J)=-1
 60 NEXT J,I
 70 INPUT X,Y,W
 80 IF X=0 THEN 110
 90 R(X,Y)=W
 100 GOTO 70
 110 EET(1)=0
 120 FOR I=2 TO N
 130 MAX=0
 140 FOR J=1 TO N
 150 IF(R(J,I)〈 〉-1)AND R(J,I)+EET(J)>MAX THEN MAX=R(J,I)+EET(J)
 160 NEXT J:EET(I)=MAX
 170 NEXT I
 180 ET(N)=EET(N) 
190 FOR I=N -1 TO 1 STEP -1
 200 MIN=10000
 210 FOR J=1 TO N
 220 IF(R(I,J)〈 〉 -1) AND ET(J) -R(I,J)<MIN THEN MIN=ET(J)-R(I,J)
 230 NEXT J
 240 ET(I)=MIN
 250 NEXT I
 260 PRINT EET(N)
 270 FOR I=1 TO N -1
 280 IF EET(I)=ET(I) THEN PRINT I;“--->”;
 290 NEXT I: PRINT N
 300 END
真的很急啊,严重求救!!
crazy_lazy_pig 2006-06-26
  • 打赏
  • 举报
回复
代码是VB的, 去VB版问问看
ugvihc 2006-06-26
  • 打赏
  • 举报
回复
一般的数据结构书里面都有类似的算法.
建议LZ去查查看.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧