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 |
Lapple#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; const int maxn = 50+5; const int maxnVex = 100+5; char map[maxn][maxn]; int sign[maxn][maxn]; int sign2[maxn][maxn]; int N,row,col; //行,列 int count1; //s和A的总数量 typedef struct{ int y,x; int num; }Point; struct Edg{ int index; int lowCost; }closeEdg[maxnVex]; queue<Point> Q; Point vex[maxnVex]; int edg[maxnVex][maxnVex]; int dir[][2] = {{-1,0},{0,1},{1,0},{0,-1}}; void BFS(Point source){ memset(sign,-1,sizeof(sign)); int index = source.num; Q.push(source); sign[source.y][source.x] = 1; while(!Q.empty()){ Point p = Q.front(); Q.pop(); char c = map[p.y][p.x]; if(c=='#') continue; if(c=='S'||c=='A') edg[index][p.num] = sign[p.y][p.x]-1; for(int i=0;i<4;i++){ Point p1; p1.y = p.y+dir[i][0]; p1.x = p.x+dir[i][1]; if(map[p1.y][p1.x]=='S'||map[p1.y][p1.x]=='A') p1.num = sign2[p1.y][p1.x]; if(sign[p1.y][p1.x]>0) continue; if(p1.x<0||p1.y<0||p1.x>col||p1.y>row||map[p1.y][p1.x]=='#') continue; sign[p1.y][p1.x] = sign[p.y][p.x]+1; Q.push(p1); } } } int min(){ int k = 0; for(int i=0;i<count1;i++){ if(closeEdg[i].lowCost==0) continue; if(k==0) k=i; if(closeEdg[k].lowCost>closeEdg[i].lowCost) k = i; } return k; } int main(){ int len = 0; cin>>N; while(N--){ count1 = 0; cin>>col>>row; //row行,col列 gets(map[0]); for(int i=0;i<row;i++){ gets(map[i]); for(int j=0;j<col;j++){ if(map[i][j]=='S'||map[i][j]=='A'){ vex[count1].x = j; vex[count1].y = i; vex[count1].num = count1; sign2[i][j] = count1; count1++; } } } for(int i=0;i<count1;i++){ BFS(vex[i]); } closeEdg[0].index = 0; closeEdg[0].lowCost = 0; for(int i=1;i<count1;i++){ closeEdg[i].index = 0; closeEdg[i].lowCost = edg[0][i]; } for(int i=0;i<count1;i++){ int k = min(); len += closeEdg[k].lowCost; closeEdg[k].lowCost = 0; for(int j=0;j<count1;j++){ if(edg[j][k]<closeEdg[j].lowCost){ closeEdg[j].index = k; closeEdg[j].lowCost = edg[j][k]; } } } cout<<len<<endl; len = 0; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator