Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
BFS+Prim算法(附代码)//自己感觉代码写的很乱,差点就看不懂了,还好过了。一开始不只咋的RE,后面对全部的数组加大了十倍,然后就过了 #include<iostream> #include<string> #include<cmath> #include<queue> using namespace std; struct Position //广搜用的 { int x,y; int step; }pos[1005]; int dist[501][501]; int map[501][501]; int t; int x,y; int visited[501][501]; int k = 0; int direct[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; void input() { cin>>x>>y; char c = getchar(); while(c != '\n') { c = getchar(); } char str[505]; k = 0; for(int i = 1;i <= y;i++) { gets(str); int len = strlen(str); for(int j = 0;j < len;j++) { if(str[j] == '#') { map[i][j+1] = 1; } else if(str[j] == 'A' || str[j] == 'S') { pos[k].x = j+1; pos[k].y = i; pos[k].step = 0; k++; } } } /* for(int kk = 0;kk < k;kk++) cout<<"("<<pos[kk].y <<","<<pos[kk].x <<") "; cout<<endl; */ } bool isok(int xx,int yy) //判断往四个方向走是否越界 { if(xx >= 1 && xx <= x && yy >= 1 && yy <= y) return true; return false; } void computer(int mm) { queue<Position> que; Position s,t; que.push(pos[mm]); int num = 0; visited[pos[mm].y][pos[mm].x] = 1; while(!que.empty()) { s = que.front(); que.pop(); for(int j = 0;j < k && j != mm;j++) { if(s.x == pos[j].x && s.y == pos[j].y) { dist[mm+1][j+1] = s.step; dist[j+1][mm+1] = s.step; num++; break; } } if(num == k) break; for(int i = 0;i < 4;i++) { int xx = s.x + direct[i][0]; int yy = s.y + direct[i][1]; if(isok(xx,yy) && !map[yy][xx] && !visited[yy][xx]) { visited[yy][xx] = 1; t.x = xx; t.y = yy; t.step = s.step + 1; que.push(t); } } } } void distance() { for(int i = 0;i < k;i++) //每次从“S”或“A”点出发,找出从当前点到其他“A”和“S”的距离, { //用广搜,本可以剪枝的 memset(visited,0,sizeof(visited)); computer(i); } /* for(int j = 1;j <= k;j++) { for(int kk = 1;kk <= k;kk++) { cout<<dist[j][kk]<<" "; } cout<<endl; } cout<<endl; */ } void prim() //套用公式,没啥好说的,主要是距离数组的建立 { int visited_prim[105] = {0}; int lowcost[105]; int mincost = 0; int i,j; for(i = 2;i <= k;i++) { lowcost[i] = dist[1][i]; } visited_prim[1] = 1; for(i = 1;i < k;i++) { int mmax = 2500; int node ; for(j = 2;j <= k;j++) { if(!visited_prim[j] && mmax > lowcost[j]) { mmax = lowcost[j]; node = j; } } visited_prim[node] = 1; mincost += mmax; for(j = 2;j <= k;j++) { if(!visited_prim[j] && lowcost[j] > dist[node][j]) { lowcost[j] = dist[node][j]; } } } cout<<mincost<<endl; return ; } int main() { cin>>t; while(t--) { // memset(pos,0,sizeof(pos)); memset(map,0,sizeof(map)); input(); memset(dist,0,sizeof(dist)); distance(); prim(); } system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator