http://acm.hdu.edu.cn/showproblem.php?pid=1142迪杰斯特拉算法+DFS
#include <iostream>

using namespace std;

const int MAX=1000001;

int pi[1001],path[1001][1001],n,dp[1001];
bool visit[1001];

void SP(int v) //有向图最短路径,迪杰斯特拉算法


{
int i,min,j,temp;
for(i=1;i<=n;i++)

{
visit[i]=false;
pi[i]=path[i][v];
}
visit[v]=true;
pi[v]=0;
for(i=1;i<n;i++)

{
min=MAX;
for(j=1;j<=n;j++)
if(!visit[j] && pi[j]<min)

{
temp=j;
min=pi[j];
}
if(min==MAX)
break;
visit[temp]=true;
for(j=1;j<=n;j++)
if(!visit[j] && pi[j]>min+path[temp][j])
pi[j]=min+path[temp][j];
}
}

int dfs(int v) //记忆化深搜


{
if(dp[v]!=-1)
return dp[v];
if(v==2)
return 1;
int i;
dp[v]=0;
for(i=1;i<=n;i++)
if(path[i][v]!=MAX && pi[i]<pi[v])
dp[v]+=dfs(i);
return dp[v];
}

int main()


{
int m,i,j,k,p;
while(scanf("%d",&n),n)

{
scanf("%d",&m);
for(i=1;i<=n;i++)

{
dp[i]=-1;
for(j=1;j<=n;j++)
path[i][j]=MAX;
}
for(k=0;k<m;k++)

{
scanf("%d%d%d",&i,&j,&p);
path[i][j]=path[j][i]=p;
}
SP(2);
cout<<dfs(1)<<endl;
}
}
posted on 2011-04-26 12:10
大大木马 阅读(355)
评论(0) 编辑 收藏 引用