Why so serious? --[NKU]schindlerlee

2009年12月13日星期日.pku2353 最短路

最短路的变形,题意比较简单,具体看代码

  1 /* 
  2  * SOUR:pku 2353
  3  * ALGO:dp
  4  * DATE: 2009年 12月 12日 星期六 20:05:20 CST
  5  * COMM:3
  6  * */
  7 #include<iostream>
  8 #include<cstdio>
  9 #include<cstdlib>
 10 #include<cstring>
 11 #include<algorithm>
 12 #include<queue>
 13 using namespace std;
 14 typedef long long LL;
 15 const int maxint = 0x7fffffff;
 16 const long long max64 = 0x7fffffffffffffffll;
 17 const int N = 512;
 18 const int inf = 100000001;
 19 int m,n,x,y;
 20 int g[N][N],out[N*N],top,dis[N][N],vis[N][N],pre[N][N][2]; 
 21 
 22 struct Path
 23 {
 24     int x,y;
 25     int len;
 26     Path(){}
 27     Path(int a,int b,int c) { x = a,y = b,len = c;}
 28     friend bool operator < (Path a,Path b) {
 29         return a.len > b.len;
 30     }
 31 };
 32 
 33 int search()
 34 {
 35     int i,j,k;
 36     for(i = 1;i < m;i++) {
 37         for(j = 0;j < n;j++) {
 38             dis[i][j] = maxint;
 39         }
 40     }
 41     for(i = 0;i < n;i++) {
 42         dis[0][i] = g[0][i];
 43     }
 44     priority_queue<Path> que;
 45     for(i = 0;i < n;i++) {
 46         que.push(Path(0,i,g[0][i]));
 47     }
 48 
 49     int sum;
 50     int res = maxint;
 51     while(!que.empty()) {
 52         Path u = que.top(); que.pop();
 53         if(u.x == m - 1) {
 54             if(u.len < res) {
 55                 res = u.len;
 56                 x = u.x;
 57                 y = u.y;
 58                 continue;
 59             }
 60         }
 61         if(u.len != dis[u.x][u.y])
 62             continue;
 63 
 64         if (dis[u.x +1][u.y] > u.len + g[u.x+1][u.y]) {
 65             dis[u.x +1][u.y] = u.len + g[u.x+1][u.y];
 66             que.push(Path(u.x + 1,u.y,u.len + g[u.x+1][u.y]));
 67             pre[u.x+1][u.y][0= u.x;
 68             pre[u.x+1][u.y][1= u.y;
 69         }
 70 
 71         i = u.y - 1;
 72         if(i >= 0 && i < n) {
 73             sum = g[u.x][i];
 74             if (dis[u.x][i] > u.len + sum) {
 75                 dis[u.x][i] = u.len + sum;
 76                 que.push(Path(u.x,i,u.len + sum));
 77                 pre[u.x][i][0= u.x;
 78                 pre[u.x][i][1= u.y;
 79             }
 80         }
 81 
 82         i = u.y + 1;
 83         if(i >= 0 && i < n) {
 84             sum = g[u.x][i];
 85             if (dis[u.x][i] > u.len + sum) {
 86                 dis[u.x][i] = u.len + sum;
 87                 que.push(Path(u.x,i,u.len + sum));
 88                 pre[u.x][i][0= u.x;
 89                 pre[u.x][i][1= u.y;
 90             }
 91         }
 92     }
 93     return sum;
 94 }
 95 
 96 int main()
 97 {
 98     int i,j,k;
 99     scanf("%d%d",&m,&n);
100     for(i = 0;i < m;i++) {
101         for(j = 0;j < n;j++) {
102             scanf("%d",&g[i][j]);
103             pre[i][j][0= -1;
104             pre[i][j][1= -1;
105         }
106     }
107 
108     int res = search();
109     //printf("%d\n",res);
110     int tx,ty;
111     while(x != -1 && y != -1) {
112         out[top++= y;
113         tx = pre[x][y][0];
114         ty = pre[x][y][1];
115         x = tx,y = ty;
116     }
117     for(i = top - 1;i >= 0;i--) {
118         printf("%d\n",out[i] + 1);
119     }
120     return 0;
121 }
122 
123 


posted on 2009-12-13 21:32 schindlerlee 阅读(1164) 评论(0)  编辑 收藏 引用 所属分类: 解题报告


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理