光找bugs ,忘了注册cf 的比赛了,、、、、、
程序一直 TLE ,好是郁闷,搜索 直接把我搞死了
写的搜索太暴力了,改进版,代码太烂了
关键是dist 存路径距离 使搜索 直接降低一个复杂度
#include<iostream> #include<cstdio> #include<queue> #include<string.h> const int N =110; const int inf=999999999; using namespace std; struct node { int x,y; node(int a=0,int b=0):x(a),y(b){} }point[N]; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int map[N][N],dist[N][N]; char str[N][N]; int top, x,y; int prim(int n) { int dist[N],vis[N],cnt=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) dist[i]=map[0][i]; vis[0]=1;dist[0]=0; for(int i=1;i<n;i++) { int min=inf,pos=-1; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]<min) { min=dist[j];pos=j; } } if(min==inf) return -1; vis[pos]=1;cnt+=min; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]>map[pos][j]) dist[j]=map[pos][j]; } } return cnt; } void bfs(node p,int lenj,int leni) { queue <node> que; que.push( node(p.x,p.y )); dist[p.x][p.y]=0; int flag[N][N]; memset(flag,0,sizeof(flag)); flag[p.x][p.y]=1; while(!que.empty()) { node fg; fg=que.front();que.pop(); for(int i=0;i<4;i++) { int x=fg.x+dir[i][0],y=fg.y+dir[i][1]; if(x>=0&&x<leni&&y>=0&&y<lenj&&str[x][y]!='#'&&!flag[x][y]) { que.push(node(x,y)); dist[x][y]=dist[fg.x][fg.y]+1; flag[x][y]=1; } } } } void init() { top=1; cin>>x>>y; gets(str[0]); for(int i=0;i<y;i++) { gets(str[i]); for(int j=0;j<x;j++) if(str[i][j]=='A') point[top].x=i,point[top++].y=j; else if(str[i][j]=='S') point[0].x=i,point[0].y=j; } } void make() { for(int i=0;i<top;i++) { bfs(point[i],x,y); for(int j=0;j<top;j++) map[i][j]=dist[point[j].x][point[j].y]; } } int main() { int cs;cin>>cs; while(cs--) { init(); make(); cout<<prim(top)<<endl; } return 0; }