最短路径很好写,但是动态规划就.....
还是借鉴了解题报告.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define number 1005
#define MAX 1000002
int d[number+1];
int dp[number+1];
int result[number+1];
typedef struct node
{
int info;
}GraphNode;
typedef struct
{
GraphNode matrix[number+1][number+1];
int vexs[number+1];
int vertex,edge;
}Graph;
Graph g;
int DFS(int v)
{
if(dp[v] != 0)
return dp[v];
if(v == 2)
return 1;
int i,temp,sum=0;
for(i=1;i<=g.vertex;i++)
{
if(g.matrix[v][i].info!= MAX && d[v] > d[i])
{
temp = DFS(i);
sum += temp;
}
}
dp[v] = sum;
return sum;
}
int CreatGraph(Graph *G)
{
int i,k;
int x,y,data;
int vertex,edge;
scanf("%d",&vertex);
if(vertex==0)return 0;
scanf("%d",&edge);
G->vertex = vertex;G->edge = edge;
for(i=1;i<=vertex;i++)
G->vexs[i]=i;
for(i=1;i<=vertex;i++)
for(k=1;k<=vertex;k++)
{
G->matrix[i][k].info = MAX;
}
for(i=1;i<=edge;i++)
{
scanf("%d%d%d",&x,&y,&data);
G->matrix[x][y].info=data;
G->matrix[y][x].info=data;
}
return 1;
}
void dijkstral(Graph *g,int v)
{
int visited[number+1];
int i,min,u,w,flag;
memset(visited,0,sizeof(visited));
for(i=1;i<=g->vertex;i++)
{
d[i]=g->matrix[v][i].info;
}
visited[v]=1;
for(flag=1;flag<=g->vertex;flag++)
{
min=MAX;
for(i=1;i<=g->vertex;i++)
{
if(!visited[i]&&d[i]<min)
{
min=d[i];w=i;
}
}
if(min == MAX)break;
visited[w]=1;
for(u=1;u<=g->vertex;u++)
{
if(g->matrix[w][u].info + min <= d[u] && !visited[u])
{
d[u]=g->matrix[w][u].info + min;
}
}
}
d[v]=0;
}
int main()
{
int i;
while(1)
{
i=CreatGraph(&g);
if(!i)break;
dijkstral(&g,2);
memset(dp,0,sizeof(dp));
DFS(1);
printf("%d\n",dp[1]);
}
return 0;
}