1010 Problem J
2016-07-06 21:11
330 查看
题意:从办公室1到家2之间,有多条路可以走,求最短路径的道路共有多少条。
思路:先求出两点之间的最短路径,然后再利用搜索算法,搜索路径的条数。
感想:最短路径求解与搜索的结合,搜索的关键还是在于递归。
#include<iostream>
#include<stdio.h>
#include<string.h>
const intINF=10000000;
intmap[1005][1005];
intvis[1005],dis[1005];
int m,n;
intdp[1005];
void mp()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) map[i][j]=INF;
else map[i][j]=0;
}
voiddijkstra(int t)
{
int i,j,mmin,pos;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=map[t][i];
dis[t]=0;
vis[t]=1;
for(i=2;i<=n;i++)
{
mmin=INF;
for(j=1;j<=n;j++)
{
if(!vis[j]&&mmin>dis[j])
{
pos=j;
mmin=dis[j];
}
}
if(mmin==INF) break;
vis[pos]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[pos]+map[pos][j]<dis[j])
dis[j]=dis[pos]+map[pos][j];
}
}
}
intdfs(int p)
{
int i;
if(dp[p]!=-1)
return dp[p];
if(p==2)
return 1;
dp[p]=0;
for(i=1;i<=n;i++)
if(map[p][i]!=INF&&dis[p]>dis[i])
{
dp[p]=dp[p]+dfs(i);
}
return dp[p];
}
int main()
{
int i,a,b,c;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d",&m);
mp();
for(i=1;i<=m;i++)
{
scanf("%d %d%d",&a,&b,&c);
if(map[a][b]>c)map[a][b]=map[b][a]=c;
}
dijkstra(2);
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(1));
}
return 0;
}
思路:先求出两点之间的最短路径,然后再利用搜索算法,搜索路径的条数。
感想:最短路径求解与搜索的结合,搜索的关键还是在于递归。
#include<iostream>
#include<stdio.h>
#include<string.h>
const intINF=10000000;
intmap[1005][1005];
intvis[1005],dis[1005];
int m,n;
intdp[1005];
void mp()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) map[i][j]=INF;
else map[i][j]=0;
}
voiddijkstra(int t)
{
int i,j,mmin,pos;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=map[t][i];
dis[t]=0;
vis[t]=1;
for(i=2;i<=n;i++)
{
mmin=INF;
for(j=1;j<=n;j++)
{
if(!vis[j]&&mmin>dis[j])
{
pos=j;
mmin=dis[j];
}
}
if(mmin==INF) break;
vis[pos]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[pos]+map[pos][j]<dis[j])
dis[j]=dis[pos]+map[pos][j];
}
}
}
intdfs(int p)
{
int i;
if(dp[p]!=-1)
return dp[p];
if(p==2)
return 1;
dp[p]=0;
for(i=1;i<=n;i++)
if(map[p][i]!=INF&&dis[p]>dis[i])
{
dp[p]=dp[p]+dfs(i);
}
return dp[p];
}
int main()
{
int i,a,b,c;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d",&m);
mp();
for(i=1;i<=m;i++)
{
scanf("%d %d%d",&a,&b,&c);
if(map[a][b]>c)map[a][b]=map[b][a]=c;
}
dijkstra(2);
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(1));
}
return 0;
}
相关文章推荐
- poj 3784 Running Median 二叉堆
- 基于MapReduce的手机上网流量统计分析
- python环境安装
- BZOJ 4518: [Sdoi2016]征途
- 提高项目24-删除数组元素
- CF355div2
- 新生练习2
- classLoader读取文件与文件流读取文件示例与注意事项
- java中重载Overriding与重写Overloading的区别
- 01_AssignmentOperator赋值运算符函数
- JZOJ 3441. 小喵喵的新家
- 《leetCode》:Combination Sum III
- 读《联盟》
- Ubuntu16.04下配置laravel
- 传统企业做互联网的困局
- Project Euler 19: Counting Sundays
- js中如何在各个操作中共享信息
- leetcode题解日练--2016.7.6
- [JZOJ4438] K小数查询(经典分块)
- 面试