有几个错误,调试了几个小时,样例过后 1Y.
题目:http://poj.org/problem?id=3026
题意:就是让求A们和S的最小生成树
先用bfs找每两点的距离,再建树。没剪枝 63MS。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<stack> 6 #include<queue> 7 #include<cmath> 8 #include<algorithm> 9 using namespace std; 10 11 char G[60][60]; 12 int dx[5]={0,0,1,-1}; 13 int dy[5]={1,-1,0,0}; 14 int r,c,bin[10010],an,ff[150][150]; //an表示边数 15 struct node 16 { 17 int x,y; 18 }e[150]; //表示点 19 20 struct tree 21 { 22 int u,v,w; 23 }q[11000];//边及权值 24 25 struct point 26 { 27 int x,y,step; 28 }next,pos;//bfs 里的队列 29 30 void add(int u,int v,int w)//加边 31 { 32 q[an].u=u; q[an].v=v; q[an++].w=w; 33 } 34 35 void bfs(int f,int x,int y) 36 { 37 int vis[60][60],i; 38 queue<point>qu; 39 memset(vis,0,sizeof(vis)); 40 next.x=x; next.y=y; next.step=0; 41 qu.push(next); 42 vis[x][y]=1; 43 while(!qu.empty()) 44 { 45 pos=qu.front(); 46 qu.pop(); 47 for(i=0; i<4; i++) 48 { 49 next.x=pos.x+dx[i]; next.y=pos.y+dy[i]; next.step=pos.step+1; 50 if(next.x>=0 && next.x<r && next.y>=0 && next.y<c && vis[next.x][next.y]==0 && G[next.x][next.y]!='#') 51 { 52 vis[next.x][next.y]=1; 53 qu.push(next); 54 if(G[next.x][next.y]=='A'||G[next.x][next.y]=='S') 55 add(f,ff[next.x][next.y],next.step); 56 } 57 } 58 } 59 } 60 int cmp(const void *a,const void *b) 61 { 62 return (*(tree *)a).w-(*(tree *)b).w; 63 } 64 int find(int a) 65 { 66 if(a==bin[a]) 67 return a; 68 else 69 bin[a]=find(bin[a]); 70 }; 71 int main() 72 { 73 int t,cnt,i,j,x,y,num,sum;//cnt表示点的个数 74 char str[200]; 75 cin>>t; 76 while(t--) 77 { 78 sum=0; num=0; an=0; 79 cin>>c>>r; 80 gets(str); 81 for(i=0; i<r; i++) 82 gets(G[i]); 83 84 cnt=0; 85 for(i=0; i<r; i++) 86 for(j=0; j<c; j++) 87 if(G[i][j]=='S'||G[i][j]=='A') 88 { 89 ff[i][j]=cnt; 90 e[cnt].x=i; e[cnt++].y=j; 91 } 92 93 for(i=0; i<cnt; i++) 94 { 95 bfs(i,e[i].x,e[i].y); 96 } 97 98 for(i=0; i<cnt; i++) 99 bin[i]=i; 100 qsort(q,an,sizeof(q[0]),cmp); 101 for(i=0; i<=an-1; i++) 102 { 103 x=find(q[i].u); y=find(q[i].v); 104 if(x!=y) 105 { 106 sum+=q[i].w; 107 num++; 108 bin[x]=y; 109 } 110 if(num==cnt-1) 111 break; 112 } 113 printf("%d\n",sum); 114 } 115 } 116