——
1
2
3
=VE …? …
D=VE …? …
G2
G2
5
G=VEG1=V1E1V1? VE1? EE1V1 G1G
(b)(c) (a)
6
G G
G G
D D
DD
7
G G
G
TG T
TG
TG
T


2v1
2vi
struct node //
{ int vertex; //
struct node *link; //
}; typedef struct NODE
NODE adjlist[MAX]; //
2vv
3
0
1
2
3
m-1
0
1
2
3
m-1
int create(NODE *adjlist[ ] )
{ NODE *p;
int num,i,v1,v2;
scanf(“%d\n”,&num); //
for(i=0; i<num; i++) //
{ adjlist[i].link=NULL; adjlist[i].vertex=i; }
for(; ;)
{ scanf(“%d to %d\n”,&v1,&v2); //
if (v1<0 || v2<0) break; //
p=(NODE *)malloc(sizeof(NODE));
p->vertex=v2;
p->link=adjlist[v1].link; adjlist[v1].link=p; //
p=(NODE *)malloc(sizeof(NODE));
p->vertex=v1;
p->link=adjlist[v2].link; adjlist[v2].link=p;
} return(num); //
}
typedef struct node
{ int vertex; //
struct node *link; //
}; typedef struct NODE
NODE adjlist[MAX]; //
main( )
{ NODE adjlist[ MAX];
int num;
num=create(adjlist ); /* G */
depthfirst(adjlist,num); /* G */
}
void depthfirst( NODE adjlist[],int num)
{ int i;
for (i=0; i<num;i++)
{ ptr[i]=adjlist[i].link; //
visit[i]=0; //
}
for (i=0; i<num;i++)
if (visit[i] = =0) dfs(i); //vi
G
}
void dfs( int v)
{ int w;
printf(,%d,“,v); visit[v]=1; //
while (ptr[v]=NULL
{ w= ptr[v]->vertex; w
if ( visit[w]= =0; ) dfs(w);
ptr[v]=ptr[v]->link; // v
} w
}
vG
void dfs( int v)
{ int w;
printf(,%d,“,v); visit[v]=1; //
while (ptr[v]=NULL
{ w= ptr[v]->vertex; w
if ( visit[w]= =0; ) dfs(w);
ptr[v]=ptr[v]->link; // v
} w
}
void prev (NODE *root)
{ if (root!=NULL)
{ printf(“%d,”,root->data) //
prev(root->lch); //
prev(root->rch);
}
}


Q

// vi
// G
,”
,”
1
G G n-1
,
’ ’
G=VEnT=UTE
1U={u0}TE=?
2u?U v?V-U u,vu,v)
3(u,v) TEu U
4(2)3U=V
:
:
,u,v)
(u,v)TEuU
U V-U
vivj
i
closest[i]
lowcost[i]
0 1 2 3 4 5
i
closest[i]
lowcost[i]
0 1 2 3 4 5
U={ v0}
U={ v0,v2}
V-U={ v1,V2,V3,V4,V5 }
V-U={ v1,V3,V4,V5 }
cost[MAX][MAX],
(

,”
G=VEnn T=V?
1E T T
2
E xi,xj xi,xj u T xj v u
sets[ ]
1 G n n xi i sets[ i ]=i,i i
2E xi,xj
3sets[ i ]= sets[ j ],xi xj 24
4 xi,xj Txj v xj xi u xi v=sets[j]u
=sets[i] sets[ ] sets[k]=v,sets[k]=u 2
5234n-1
0 1 2 3 4 5
0 1 2 3 4 5
sets
0 1 2 3 4 5
0 1 2 3 4 5
sets 0 1 2 3 4 5
0 1 2 3 4 5
sets
1
0 310 01 1 1 1
23 4
5
struct node
{ int begin,end; //
int cost; }; //
typedef struct node EDGE;
EDGE edges[MAX]; //
int num; //
//
// xi u,xj v
// xi,xj
,”
// xivu
V0V4
V0V4 V0 V4 45
V0 V1 V4 60
V0 V2 V3 V4 60
V0 V2 V3 V1 V4 55
1) Dijkstra
1
2) Dijkstra
V0 V-U =
Vi? V - U V0 Vi
U
32
,
1U={v0},dist[N] vi ( i? U )vi dist[i]v0vj j? V - U )vj dist[j]WvjWvjv0vj
(?V - U )j? V - U dist[j]=cost[v][j]; U={v},dist[v]= - cost[v][v]
2dist[ ]0dist[j]j? V - U )v0vjj? V - U )
3vjU dist[j]=-dist[j].
4dist[k](k? V - U ) v0vjvk -dist[j]+cost[j][k]<disk[k] dist[k]= -disk[j]+
cost[j][k]
(5)234 n-1
10
3
5
20
8
25
4
30 3
30
0
1
2
4
3
( a) ( b ) 0
0
1
2
4
3
12
3
8
25
30
0
1
2
4
3
( c ) ( d )
3
8
12
4
0
1
2
4
3
3
8
12
4
3
8
12
4
( e ) ( f )
0
1
2
4
3
0
1
2
4
3
7 - 27
,”
int mincost( int dist[ ])
{ int i,min,j;
min=MAX;j=0;
for(i=0;i<N;i++)
if(dist[i]>=0&& dist[i]<min)
{min=dist[i];j=i; }
return(j);
}
7.5.2
1
G=(V,E),Gu v ( u ≠v),u v v u
:,n,,O(n3)
(Floyd),O(n3),n
2
cost[N][N]:
NxNA[N][N]0A[i][j]ij
∞,A[i][j]=cost[i][j],
0A[i][j]A[i][0]+A[0][j]A[i][j].
:
A(0)[i][j]=cost[i][j]; //cost
A(k)[i][j]=min{A(k-1) [i][j],A(k-1) [i][k]+A(k-1) [k][j]}
k=0,1,2,…,n-1
1A[i][j]A[i][1]+A[1][j]A[i][j]… n A[i][j],,A[i][j]ij
3
Void floyd (int cost[ ][N] )
{ int a[N][N],i,j,k;
for ( i=0; i<N; i++)
for ( j=0; j<N; j++)
a[i][j]=cost[i][j]; //
for ( k=0; k<N; k++) // vk(k=0,1,..n-1)
for ( i =0; i<N;i++)
for (j=0; j<N; j++) //
if (a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[i][k]+a[k][j];
for (i=0;i<N; i++) //
for (j=0; j<N; j++)
printf(“(%d,%d):%d”,i,j,a[i][j]);
}
ON 3 ),N
AOVAOE
AOV
1
AOV
c4
c1
c2
c3
c12
c9 c10
c11
c6
c7
c3
c5
V0,V1,V2,V4,V3,V5,V6,
C1,C9,C4,C2,C10,C11,C12,C3,C6,C5,C7,C8
vu v u
c4
c1
c2
c3
c12
c9 c10
c11
c6
c7
c3
c5
Dv u Dvuvu
AOV
AOV
AOV
2
1v
2vv
312V0,V1,V2,V3,V4,V5,V6
1()
1 0 v
2 v 1
312 0
2
1 0 v
2 v u 1
struct node
{ int degree;
struct node *link;
};typedef struct node NODE;
3
3
(AOV) G
int degree
int stack[ ] 0
4AOV
int create( NODE adjlist[ ])
{ NODE *p;
int num,i,v1,v2;
sanf(,%d\n”,&num);
for (i=0; i<num; i++) //
{ adjlist[i].link=NULL; adjlist[i].degree=0; }
for(; ;) { scanf(“%d to %d\n”,&v1,&v2); //
if (v1<0 || v2<0) break; //
p=(NODE *)malloc(sizeof(NODE));
p->vertex=v2;
p->link=adjlist[v1].link; adjlist[v1].link=p; //
adjlist[v2].degree++; //
} return(num); //
}
5
int toposort(NODE adjlist[ ],int num)
//G
//GG10
{ int stack[MAX]; //0
int i,top,out,k; NODE *p;
int num1=0;top=0;
for(i=0; i<num; i++)
if (adjlist[i].vertex= =0) //0
{ stack[top]=i; top++;}
while( top>0)
{ top--; out=stack[top];
printf(,%d,”,out); num1++;
p=adjlist[out].link;
while ( p!=NULL)
{ k=p->vertex;
adjlist[k].vertex- -; //1
if (adjlist[k].vertex= =0) //0
{stack[top]=k;top++;}
p=p->link;
}
}
if (num1<num) return( 0); //
else return (1);
}
AOE
akjak
VjViak
AOE
AOVAOEAOVAOEAOE
AOE
vjve[j]:
vjvl[i]:
vj
ake[k]
ak 1[i]:
ak j
ak diff[k]
1 vjve[j]
ve[1]=0
ve[j]=Max{ve(i)+dut(<i,j>)} ve[j]=vj
i
2 vjvl[i]
ve[j]=vj
vl[n]=ve[n]
vl[j]=Min{vl(k)-dut(<j,k>)} vli]=vl[n]-vj
k
3 ake[k]
ak=<i,j>,e[k]=ve[i]
4 ak 1[i]
1[k]=vl[j]-dur(<i,j>)
5 ak diff[k]
diff[k]= 1[k]- e[k]
ai1[i]e[i]ai
6 ai
1[i]-e[i]=0