标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10554 | Accepted: 3501 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
题意:求每个字母彼此之间的距离,找到一条最短路径将所有字母相连。
思路:用BFS枚举每个字母之间的距离,再用prim求出最短的一条路径。
收获:了解了prim要初始化和1相连的边权。
这题还要再做一遍。
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <ctime> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> using namespace std; const int INF=0x3f3f3f3f; const double eps=1e-10; const double PI=acos(-1.0); #define maxn 1000 struct Node { int x, y, dis; }; Node st, et; int vis[maxn][maxn]; char map1[maxn][maxn]; int vis2[maxn]; int node[maxn][maxn]; int edge[maxn][maxn]; int dis[maxn]; int pre[maxn]; int dx[] = {0, 0, -1, 1}; int dy[] = {1, -1, 0 ,0}; int sum, n, m; void bfs(int i, int j) { memset(vis, 0, sizeof vis); queue<Node> q; Node st = {i, j, 0}; vis[i][j] = 1; q.push(st); while(!q.empty()) { Node t = q.front(); q.pop(); if(node[t.x][t.y]) edge[node[st.x][st.y]][node[t.x][t.y]] = t.dis; for(int i = 0; i < 4; i++) { int x0 = t.x + dx[i]; int y0 = t.y + dy[i]; if(!vis[x0][y0] && map1[x0][y0] != ‘#‘ && x0>=0 && x0 < m && y0 >= 0 && y0 < n) { vis[x0][y0] = 1; Node f = {x0, y0, t.dis+1}; q.push(f); } } } } int low[maxn]; int Prim() { int s=1,i,count=1,prim_sum=0,t; bool flag[maxn]={false}; flag[s] = true; for(i=1; i<=sum; i++) low[i] = 99999; while(count < sum) { int min_dis = 99999; for(i=1; i<=sum; i++) { if(!flag[i] && low[i]>edge[s][i]) low[i] = edge[s][i]; if(!flag[i] && low[i]<min_dis) { min_dis = low[i]; t = i; } } s = t; count++; flag[s] = true; prim_sum += min_dis; } return prim_sum; } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); char temp[50]; gets(temp); sum = 0; memset(node, 0, sizeof node); memset(edge, 0, sizeof edge); for(int i = 0; i < m; i++) { gets(map1[i]); for(int j = 0; j < n; j++) { if(map1[i][j] == ‘S‘ || map1[i][j] == ‘A‘) node[i][j] = ++sum; } } for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) if(node[i][j]) bfs(i, j); printf("%d\n", Prim()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/ZP-Better/p/4734316.html