终于把关键路径搞定了,以前学习的时候,对什么最早发生时间,最迟反生时间,活动最早开始时间,活动最晚开始时间,都是一塌糊涂的,昨晚宿友的一番解释,终于搞定了,谢谢兵哥!!哈哈!!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
int x;
int v;
int next;
int info;
}enode[10005];
int l[10005],e[10005];
int stack[1005],degee[1005];
int in[1005],ve[1005],vl[1005];
int top,count,num,n,m;
int head[1005];
int vetime()
{
int i,j;
top=-1;
num=-1;
count=0;
for(i=1;i<=n;i++)
{
if(in[i]==0)
{
degee[++num]=i;
ve[i]=0;
}
}
while(num!=-1)
{
j=degee[num];
num--;
stack[++top]=j;
count++;
for(i=head[j];i;i=enode[i].next)
{
int k=enode[i].v;
in[k]--;
if(in[k]==0)
{
degee[++num]=k;
}
if(ve[j]+enode[i].info>ve[k])
{
ve[k]=ve[j]+enode[i].info;
}
}
}
if(count<n)
return 0;
else
return 1;
}
void vltime()
{
int i,j;
for(i=1;i<=n;i++)
{
vl[i]=ve[n];
}
while(top!=-1)
{
j=stack[top];
top--;
for(i=head[j];i;i=enode[i].next)
{
int k=enode[i].v;
if(vl[k]-enode[i].info<vl[j])
{
vl[j]=vl[k]-enode[i].info;
}
}
}
}
void guanjian()
{
int i,u=0;
int path[1005];
for(i=1;i<=m;i++)
{
e[i]=ve[enode[i].x];
l[i]=vl[enode[i].v]-enode[i].info;
}
printf("关键活动\n");
for(i=1;i<=m;i++)
{
if(e[i]==l[i])
{
printf("%d ",i);
path[u++]=i;
}
}
printf("\n");
printf("关键路径\n");
printf("%d %d ",enode[path[0]].x,enode[path[0]].v);
for(i=1;i<u;i++)
printf("%d ",enode[path[i]].v);
printf("\n");
}
int main()
{
//freopen("a.txt","r",stdin);
int x,y,w;
scanf("%d%d",&n,&m);
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
int t=1;
while(m--)
{
scanf("%d%d%d",&x,&y,&w);
enode[t].x=x;
enode[t].v=y;
enode[t].info=w;
enode[t].next=head[x];
head[x]=t;
t++;
in[y]++;
}
m=t-1;
if(vetime()==0)
{
printf("有环\n");
}
else
{
vltime();
guanjian();
}
//system("pause");
return 0;
}