题目 http://acm.hdu.edu.cn/showproblem.php?pid=1142
刚开始拿着这个题目,但是不会做 我以为只是求最短路哦,没想到还有深度搜索 呵呵 在参考其他人代码的情况下给搞出来的
首先我们来介绍一下题意 我理解为 起点是1 终点是2 在A到2 的道路上,你能计算几条B到2的道路(距离比A到2 的道路要小)A,B是链接的。。
所以我们要求出所有点到 2 的距离,因为2是终点哦。所以我们先用Dijkstra来求出距离哦,在深度搜索。。。。
#include<iostream>
#include<cstring>
using namespace std;
int a[1002][1002],dp[1002],dis[1002];
bool visit[1002];
int n,m;
#define INF 9999999
int dfs(int v)
{
int i,temp,sum=0;
if(dp[v]!=-1)
return dp[v];
if(v==1)
return 1;
for(i=0;i<n;i++)
{
if(a[v][i]!=INF&&dis[v]>dis[i]) ///计算一共有几条道路
{
temp=dfs(i);
sum+=temp;
}
}
dp[v]=sum;
return sum;
}
void Dijkstra(int v)
{
int min,k;
memset(visit,false,sizeof(visit)); ///着色
for(int i=0;i<n;i++)
dis[i]=a[v][i];
dis[v]=0;
for(int i=0;i<n;i++)
{
min=INF;
for(int j=0;j<n;j++)
{
if(!visit[j]&&dis[j]<min) ///找出最短的边
{
min=dis[j];
k=j;
}
}
visit[k]=true;
for(int j=0;j<n;j++)
{
if(!visit[j]&&dis[k]+a[k][j]<dis[j])///更新没一条边距离
{
dis[j]=dis[k]+a[k][j];
}
}
}
}
int main()
{
int i,j,k;
while(cin>>n,n)
{
for(i=0;i<n;i++)
{
dp[i]=-1;
for(j=0;j<n;j++)
a[i][j]=INF;
}
cin>>m;
while(m--)
{
cin>>i>>j>>k;
i=i-1,j=j-1; ///注意我是从0开始的
if(a[i][j]>k)
a[i][j]=a[j][i]=k;
}
Dijkstra(1);
dfs(0);
cout<<dp[0]<<endl;
}
return 0;
}