http://acm.hdu.edu.cn/showproblem.php?pid=1428
dijstra+dp;
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #include <algorithm> 5 #define maxn 100 6 #define ll __int64 7 using namespace std; 8 const int inf=1<<29; 9 10 int g[maxn][maxn]; 11 bool vis[maxn][maxn]; 12 ll dis[maxn][maxn]; 13 ll dp[maxn][maxn]; 14 int n; 15 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; 16 struct node 17 { 18 int x,y,w; 19 bool friend operator <(node a,node b) 20 { 21 return a.w>b.w; 22 } 23 }st1,st; 24 25 void dijstra(int x,int y) 26 { 27 memset(vis,false,sizeof(vis)); 28 for(int i=0; i<=n; i++) 29 { 30 for(int j=0; j<=n; j++) 31 { 32 dis[i][j]=inf; 33 } 34 } 35 priority_queue<node>q; 36 st.x=x; 37 st.y=y; 38 st.w=g[x][y]; 39 dis[x][y]=g[x][y]; 40 q.push(st); 41 while(!q.empty()) 42 { 43 st1=q.top();q.pop(); 44 if(vis[st1.x][st1.y]) continue; 45 vis[st1.x][st1.y]=true; 46 for(int i=0; i<4; i++) 47 { 48 int xx=st1.x+dir[i][0]; 49 int yy=st1.y+dir[i][1]; 50 if(xx>=0&&xx<n&&yy>=0&&yy<n&&!vis[xx][yy]) 51 { 52 if(dis[st1.x][st1.y]+g[xx][yy]<dis[xx][yy]) 53 { 54 dis[xx][yy]=dis[st1.x][st1.y]+g[xx][yy]; 55 st.x=xx; 56 st.y=yy; 57 st.w=dis[xx][yy]; 58 q.push(st); 59 } 60 } 61 } 62 } 63 } 64 65 ll dfs(int x,int y) 66 { 67 if(dp[x][y]) return dp[x][y]; 68 for(int i=0; i<4; i++) 69 { 70 int x1=x+dir[i][0]; 71 int y1=y+dir[i][1]; 72 if(x1>=0&&x1<n&&y1>=0&&y1<n&&dis[x1][y1]<dis[x][y]) 73 dp[x][y]+=dfs(x1,y1); 74 } 75 return dp[x][y]; 76 } 77 int main() 78 { 79 while(scanf("%d",&n)!=EOF) 80 { 81 memset(g,0,sizeof(g)); 82 for(int i=0; i<n; i++) 83 { 84 for(int j=0; j<n; j++) 85 { 86 scanf("%d",&g[i][j]); 87 } 88 } 89 dijstra(n-1,n-1); 90 memset(dp,0,sizeof(dp)); 91 dp[n-1][n-1]=1; 92 printf("%I64d ",dfs(0,0)); 93 } 94 return 0; 95 }