Program4_J
来源:互联网 发布:js ie8 appendchild 编辑:程序博客网 时间:2024/06/06 01:25
我现在做的是第四专题编号为1010的试题,具体内容如下所示:
Problem J
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 59 Accepted Submission(s) : 18
5 61 3 21 4 23 4 31 5 124 2 345 2 247 81 3 11 4 13 7 17 4 17 5 16 7 15 2 16 2 10
24
简单题意:
存在一条路从A到B,且将选择这条路回家,现在是问从B到家短于任意一条从A到家的路,问存在这样的从A到家的路有多少条
解题思路:
从终点求一次最短路,然后记忆化搜索求路径条数。
编写代码:
#include<iostream>
#include<cstring>
using namespace std;
const int INF=100000000;
const int MAXN=1005;
int n,m;
int S[MAXN],dist[MAXN],map[MAXN][MAXN];
int sum[MAXN];
void Dijkstra(int v)
{
int i,j,k,u;
for(i=0;i<=n;i++)
{
dist[i]=map[v][i];
S[i]=0;
}
S[v]=1;
dist[v]=0;
for(i=0;i<n-1;i++)
{
int min=INF,u=v;
for(j=1;j<=n;j++)
{
if(!S[j]&&dist[j]<min)
{
u=j;
min=dist[j];
}
}
S[u]=1;
for(k=1;k<=n;k++)
{
if(!S[k]&&map[u][k]<INF&&dist[k]>dist[u]+map[u][k])
{
dist[k]=dist[u]+map[u][k];
}
}
}
}
int DFS(int i)
{
int j;
if(i==2)
return 1;
if(sum[i]!=-1)
return sum[i];
int cnt=0;
for(j=1;j<=n;j++)
{
if(map[i][j]<INF&&dist[j]<dist[i])
cnt+=DFS(j);
}
sum[i]=cnt;
return sum[i];
}
int main()
{
int i,j;
while(cin>>n)
{
if(n==0)
break;
cin>>m;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
map[i][j]=i==j?0:INF;
}
int a,b,w;
while(m--)
{
cin>>a>>b>>w;
if(map[a][b]<w)
continue;
map[a][b]=w;
map[b][a]=w;
}
Dijkstra(2);
memset(sum,-1,sizeof(sum));
cout<<DFS(1)<<endl;
}
return 0;
}
- Program4_J
- Android新浪微博开发(二)界面设计之低版本实现Material Design效果
- 【腾讯优测干货分享】鹅厂专家详解Android N适配要点
- STL之优先级队列priority_queue
- 【记录】STM32 printf函数实现方法
- 谷歌浏览器打不开新浪微博
- Program4_J
- 5-13 六度空间 BFS 查找各个点之间的距离(有减枝)
- 通过Ajax进行删除操作
- haproxy redirect location和redirect prefix
- Altium Designer 画的板子到了
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- mysql多表级联删除
- Java 集合系列01之 总体框架
- mysq添加外键约束