算法:
1.刚开始自己的算法是一次BFS,求出各点距离,建好图,但是提交上去一直WA,不解。
2.修正算法枚举所有A与S点,AC。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<queue> #include<iostream> using namespace std; struct node { int a, b, num; bool operator < ( const node& A) const { return num < A.num; } }edge[4100000]; struct Qnode { int ID, x, y, preID; int dis; }p, px[110]; int N, e, A, B, set[41000], visit[40000], maxn; int xx[ ] = {0, 1, -1, 0}; int yy[ ] = {1, 0, 0, -1}; char mp[510][510]; queue<Qnode>q; int find( int x ) { return x == set[x] ? x : set[x] = find(set[x]); } void merge( int x, int y) { set[x] = y; } int jugde( int x, int y) { if ( x < 1 || x > B || y < 0 || y >= A ) return 0; return 1; } void BFS(int x) { memset(visit, 0, sizeof(visit)); visit[x] = 1; while( !q.empty() ) { p = q.front(); q.pop( ); int x = p.x; int y = p.y; int ID = p.ID; int num = p.dis; int pre = p.preID; if( mp[x][y] == 'A' && ID != x) { edge[e].a = pre; edge[e].b = ID; edge[e++].num = num; } for( int i = 0; i < 4; i++) { int x1 = x + xx[i]; int y1 = y + yy[i]; int ans = x1 * maxn + y1; if( mp[x1][y1] != '#' && !visit[ans] && jugde(x1,y1) ) { p.x = x1; p.y = y1; p.preID = pre; p.ID = ans; p.dis = num + 1; q.push( p ); visit[ans] = 1; } } } } void init( ) { for( int i = 1; i <= 40000; i++) { set[i] = i; } } void Krusal( ) { init( ); int sum = 0; sort( edge, edge + e); for( int i = 0; i < e; i++) { int x = find(edge[i].a); int y = find(edge[i].b); if( x != y ) { merge(x, y); sum += edge[i].num; } } printf("%d\n",sum); } int main( ) { int T, n; scanf("%d",&T); while( T-- ) { e = 0; n = 0; scanf("%d%d",&A,&B); maxn = max(A, B); char c[100]; gets(c); for( int i = 1; i <= B; i++) { gets(mp[i]); for( int j = 0; j < A; j++) { if( mp[i][j] == 'S' || mp[i][j] == 'A') { px[n].dis = 0; px[n].x = i; px[n].y = j; px[n].ID = px[n].x * maxn + px[n].y; px[n].preID = px[n].ID; n++; } } } for( int i = 0; i < n; i++) { q.push( px[i] ); BFS( px[i].ID ); } Krusal(); } return 0; }