标签:code 初始化 other cat 记忆化 new math sample ++
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7995 Accepted Submission(s): 2943
1 //并不是求最短路的条数。先dijk出2到每个点的最短路,在记忆化搜索出路径数 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 const int MAX=10000007; 8 int mp[1005][1005],dis[1005],vis[1005],path[1005]; 9 int n,m; 10 void dijk() 11 { 12 for(int i=1;i<=n;i++) 13 { 14 dis[i]=mp[2][i]; 15 vis[i]=0; 16 } 17 vis[2]=1; 18 for(int i=1;i<=n;i++) 19 { 20 int Min=MAX,sta=0; //sta初始化一下,防止下面找不到j,而出现vis[sta]数组越界。 21 for(int j=1;j<=n;j++) 22 { 23 if(!vis[j]&&dis[j]<Min) 24 { 25 Min=dis[j]; 26 sta=j; 27 } 28 } 29 vis[sta]=1; 30 for(int j=1;j<=n;j++) 31 { 32 if(!vis[j]&&mp[sta][j]!=MAX&&dis[j]>dis[sta]+mp[sta][j]) 33 dis[j]=dis[sta]+mp[sta][j]; 34 } 35 } 36 } 37 int dfs(int x) 38 { 39 if(path[x]!=-1) //记忆化 40 return path[x]; 41 if(x==2) 42 return 1; 43 path[x]=0; 44 for(int i=1;i<=n;i++) 45 { 46 if(mp[x][i]!=MAX&&dis[x]>dis[i]) 47 path[x]+=dfs(i); 48 } 49 return path[x]; 50 } 51 int main() 52 { 53 int a,b,c; 54 while(scanf("%d",&n)&&n) 55 { 56 scanf("%d",&m); 57 for(int i=1;i<=n;i++) 58 for(int j=1;j<=n;j++) 59 mp[i][j]=i==j?0:MAX; 60 for(int i=0;i<m;i++) 61 { 62 scanf("%d%d%d",&a,&b,&c); 63 mp[a][b]=mp[b][a]=min(mp[a][b],c); 64 } 65 dijk(); 66 memset(path,-1,sizeof(path)); 67 int ans=dfs(1); 68 printf("%d\n",ans); 69 } 70 return 0; 71 }
标签:code 初始化 other cat 记忆化 new math sample ++
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6057362.html