1010
题意:有一条A到B的路,而B到家的最短路比A到家的最短路要小,那么就可以从A到B,B到家,这可以算作一条路可走。求共有多少条这样的路从1点到家
思路:先算出每个点到点2的最短路算出来,然后用深搜+标记,减少时间,算出共有多少条路可走到家。
代码:
#include<iostream> #include<queue> using namespace std; typedef struct n1 { int distens,flog; }node; node N[1005]; int map[1005][1005],k; int direct[1005]; void set(int n) { int i,j,m,n1,n2,d; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { map[i][j]=-1; } N[i].distens=10000000;N[i].flog=0;direct[i]=0; } scanf("%d",&m); while(m--) { scanf("%d%d%d",&n1,&n2,&d); if(map[n1][n2]!=0||map[n1][n2]>d) map[n1][n2]=map[n2][n1]=d; } } void spfa(int n) { queue<int> Q; int now; int i; N[2].distens=0;N[2].flog=1; Q.push(2); while(!Q.empty()) { now=Q.front(); Q.pop(); N[now].flog=0; //if(q.x==1)break; for(i=1;i<=n;i++) if(map[now][i]!=-1) { if(N[i].distens>N[now].distens+map[now][i]) { N[i].distens=N[now].distens+map[now][i]; if(N[i].flog==0) { N[i].flog=1; Q.push(i); } } } } } int DFS(int now,int n) { int i; if(direct[now]>0) return direct[now]; if(now==2) { return 1; } for(i=1;i<=n;i++) if(map[now][i]!=-1&&N[now].distens>N[i].distens) { direct[now]+=DFS(i,n); } return direct[now]; } int main() { int n; while(scanf("%d",&n)>0&&n) { set(n); spfa(n); k=DFS(1,n); printf("%d\n",k); } }