首页 > 代码库 > HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
题意:
给你一个图,找最短路。但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路。问满足这样的路径条数 有多少,噶呜~~题意是搜了解题报告才明白的Orz.。。。英语渣~
思路:
1.1为起点,2为终点,因为要走ab路时,必须保证那个条件,所以从终点开始使用单源最短路Dijkstra算法,得到每个点到终点的最短路,保存在dis[]数组中。
2.然后从起点开始深搜每条路,看看满足题意的路径有多少条。
3.这样搜索之后,dp[1]就是从起点到终点所有满足题意的路径的条数。
AC_CODE:
1 #include<stdio.h> 2 #include<string.h> 3 #define INF 10000000 4 int map[1001][1001]; 5 int vis[1001]; 6 int dis[1001]; 7 int n,m; 8 int dp[1001]; 9 void dijkstra(int st)10 {11 int i,j,k;12 memset(vis,0,sizeof(vis));13 for(i=1;i<=n;i++)14 {15 if(i==st)16 dis[i]=0;17 else18 dis[i]=INF;19 }20 for(i=1;i<=n;i++)21 {22 int r;23 int min=INF;24 for(j=1;j<=n;j++)25 {26 if(!vis[j]&&dis[j]<min)27 {28 min=dis[j];29 r=j;30 }31 }32 vis[r]=1;33 for(k=1;k<=n;k++)34 {35 if(dis[k]>dis[r]+map[r][k])36 dis[k]=dis[r]+map[r][k];37 }38 }39 return;40 }41 int DFS(int st)42 {43 int sum=0;44 if(dp[st]!=-1)45 return dp[st];46 if(st==2)47 return 1;48 for(int i=1;i<=n;i++)49 {50 if(map[st][i]!=INF&&dis[st]>dis[i])51 sum+=DFS(i);52 }53 dp[st]=sum;54 return dp[st];55 }56 int main()57 {58 int i,j,u,v,w;59 while(scanf("%d",&n)!=EOF&&n)60 {61 for(i=1;i<=n;i++)62 {63 dp[i]=-1;64 for(j=1;j<=n;j++)65 {66 if(i==j)67 map[i][j]=0;68 else69 map[i][j]=INF;70 }71 }72 scanf("%d",&m);73 for(i=1;i<=m;i++)74 {75 scanf("%d%d%d",&u,&v,&w);76 map[u][v]=map[v][u]=w;77 }78 dijkstra(2);79 printf("%d\n",DFS(1));80 }81 return 0;82 }
————Anonymous.PJQ
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。