我现在做的是第四专题编号为1010的试题,具体内容如下所示:
Problem J
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 59 Accepted Submission(s) : 18
5 6 1 3 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 7 5 1 6 7 1 5 2 1 6 2 1 0
2 4
简单题意:
存在一条路从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;
}