http://acm.hdu.edu.cn/showproblem.php?pid=1142
题目 | 算法 | 备注 |
求下班回家不同的路的数量(若b>a,则b到终点的距离大于a到终点的距离) | 迪杰斯特拉+dfs | |
import java.util.Scanner;
public class Main {
static int max=2000000000;
public static int DFS(int s,int n,int pt[],int a[][],int d[]){
if(pt[s]!=0){return pt[s];}
if(s==2){return 1;}
int i,sum=0;
for(i=1;i<=n;i++){
if(a[s][i]!=max&&d[s]>d[i]){
if(pt[i]==0){sum=sum+DFS(i,n,pt,a,d);}
else{sum=sum+pt[i];}
}
}
sum=sum+pt[s];
pt[s]=sum;
return pt[s];
}
public static void main(String[] args) {
int m,n,i,j,p,q;
Scanner oo=new Scanner(System.in);
while(oo.hasNext()){
n=oo.nextInt();
if(n==0){break;}
m=oo.nextInt();
int a[][]=new int[n+1][n+1];
for(i=0;i<=n;i++){
for(j=i;j<=n;j++){
a[i][j]=max;
a[j][i]=max;
if(i==j){a[i][j]=0;}
}
}
for(i=0;i<m;i++){
p=oo.nextInt();
q=oo.nextInt();
a[p][q]=oo.nextInt();
a[q][p]=a[p][q];
}
int d[]=new int[n+1];
for(i=1;i<=n;i++){d[i]=max;}
d[2]=0;
boolean b[]=new boolean[n+1];
int min=max,u=0;
for(i=0;i<n;i++){
min=max;
for(j=1;j<=n;j++){
if(b[j]==false&&d[j]<min){
min=d[j];
u=j;
}
}
b[u]=true;
for(j=1;j<=n;j++){
if(d[u]+a[u][j]<d[j]){
d[j]=d[u]+a[u][j];
}
}
}
int pt[]=new int[n+1];
System.out.println(DFS(1,n,pt,a,d));
}
}
}