1. 程式人生 > >關鍵路徑分析

關鍵路徑分析

問題 for ret printf oop value return 指向 clu

一條有向邊E,權值為EdgeValue,點i指向點j,稱呼點i為始點,點j為終點。

事件最早發生時間ve:只要始點(多個)都已準備好就立即行動,即選擇始點(多個)中最早發生時間最晚的

ve(j)=max{ve(i)+EdgeValue}

事件最晚發生時間vl:選擇事件最晚發生時間,使終點(多個)到達後剛好不會發生問題,即選擇終點(多個)中最晚發生時間最早的

vl(i)=min{vl(j)-EdgeValue}

活動最早發生時間l:只要始點(一個)都已準備好就立即行動,即選擇始點(一個)最早發生時間

l(E)=vl(i)

活動最晚發生時間e:選擇事件最晚發生時間,使終點(一個

)到達後剛好不會發生問題,即選擇終點(一個)中最晚發生時間最早的

e(E)=ve(j)-EdgeValue

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <malloc.h>
  4 #define maxn 1000
  5 
  6 struct node
  7 {
  8     long d; //
  9     long value; //邊權值
 10     struct node *next;
 11 }*in[maxn+1],*out[maxn+1];
 12 //in:某點作為邊的終點,所有對應邊的始點
13 //out:某點作為邊的始點,所有對應邊的終點 14 //編號為k的邊的始點和終點為x[k]和y[k],權值為z[k] 15 //點k的出度為g[k] 16 //隊列為q 17 //ve(early),vl(late),e,l分別為事件最早,最晚發生時間,活動最早,最晚發生時間 18 long x[maxn+1],y[maxn+1],z[maxn+1],g[maxn+1],q[maxn+1],ve[maxn+1],vl[maxn+1],e[maxn+1],l[maxn+1]; 19 20 long max(long a,long b) 21 { 22 if (a>b) 23
return a; 24 else 25 return b; 26 } 27 28 long min(long a,long b) 29 { 30 if (a>b) 31 return b; 32 else 33 return a; 34 } 35 36 int main() 37 { 38 long n,m,head,tail,i,s,t; 39 struct node *p; 40 scanf("%ld%ld",&n,&m); 41 //init 42 for (i=1;i<=n;i++) 43 g[i]=0; 44 for (i=1;i<=m;i++) 45 { 46 scanf("%ld%ld%ld",&x[i],&y[i],&z[i]); 47 g[y[i]]++; 48 p=(struct node *) malloc (sizeof(struct node)); 49 p->d=y[i]; 50 p->value=z[i]; 51 p->next=out[x[i]]; 52 out[x[i]]=p; 53 } 54 55 head=0; 56 tail=0; 57 for (i=1;i<=n;i++) 58 if (g[i]==0) 59 { 60 tail++; 61 q[tail]=i; 62 } 63 64 //init 65 for (i=1;i<=n;i++) 66 ve[i]=0; 67 while (head<tail) 68 { 69 head++; 70 s=q[head]; 71 p=out[s]; 72 while (p!=NULL) 73 { 74 t=p->d; 75 g[t]--; 76 ve[t]=max(ve[t],ve[s]+p->value); 77 if (g[p->d]==0) 78 { 79 tail++; 80 q[tail]=p->d; 81 } 82 p=p->next; 83 } 84 } 85 if (tail<n) 86 { 87 printf("has loop\n"); 88 exit(1); 89 } 90 91 //init 92 for (i=1;i<=n;i++) 93 vl[i]=2000000000; 94 vl[q[tail]]=ve[q[tail]]; 95 for (i=tail;i>=1;i--) 96 { 97 s=q[i]; 98 p=out[s]; 99 while (p) 100 { 101 vl[s]=min(vl[s],vl[p->d]-p->value); 102 p=p->next; 103 } 104 } 105 106 for (i=1;i<=m;i++) 107 { 108 e[i]=ve[x[i]]; 109 l[i]=vl[y[i]]-z[i]; 110 } 111 for (i=1;i<=m;i++) 112 if (e[i]==l[i]) 113 printf("%ld ",i); 114 return 0; 115 } 116 /* 117 9 11 118 7 9 2 119 8 9 4 120 5 7 8 121 5 8 7 122 6 8 4 123 2 5 1 124 3 5 1 125 4 6 2 126 1 2 6 127 1 3 4 128 1 4 5 129 */

關鍵路徑分析