題目 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 9999999int 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;}