蒟蒻求助,Udebug的都过了,就是WA
查看原帖
蒟蒻求助,Udebug的都过了,就是WA
310773
PCCP楼主2023/5/6 00:29

RT,Udebug上的数据全过了,就是过不了UVA的;

如有大佬帮助蒟蒻解决问题,蒟蒻V您¥5

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
typedef pair<int,PII> PIP;
const int N=1010;
int t,n,m,cnt,dist[N][N],fa[N],ans,tot,b[N][N];
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
char a[N][N];
string str;
PII pos[N];
queue<PIP> q;
bool st[N][N];
struct node{
	int x,y,leng;
}edge[N*N];
bool cmp(node u,node v){
	return u.leng<v.leng;
}
void bfs(int x,int y,int num){
	while(q.size()){
		q.pop();
	}
	q.push(PIP(0,PII(x,y)));
	while(q.size()){
		PIP t=q.front();
		q.pop();
		if(st[t.second.first][t.second.second]==true){
			continue;
		}
		st[t.second.first][t.second.second]=true;
		for(int i=1;i<=4;i++){
			int sx=t.second.first+dx[i],sy=t.second.second+dy[i];
			if(sx<=0||sy<=0||sx>n||sy>m||a[sx][sy]=='#'||st[sx][sy]==true){
				continue;
			}
			if(a[sx][sy]=='S'||a[sx][sy]=='A'){
				dist[num][b[sx][sy]]=min(dist[num][b[sx][sy]],t.first+1);
			}
//			cout<<t.second.first<<" , "<<t.second.second<<" -> "<<sx<<" , "<<sy<<" : "<<t.first+1<<endl;
			q.push(PIP(t.first+1,PII(sx,sy)));
		}
	}
}
int find(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=find(fa[x]);
}
void hb(int x,int y){
	fa[y]=x;
}
int main(){
	freopen("UVA10307.in","r",stdin);
	freopen("UVA10307.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&m,&n);
		char empty[100];
		gets(empty);
		cnt=ans=tot=0;
		memset(a,' ',sizeof a);
		memset(pos,0,sizeof pos);
		for(int i=1;i<=n;i++){
			getline(cin,str);
			for(int j=1;j<=m;j++){
				a[i][j]=str[j-1];
				if(a[i][j]=='A'||a[i][j]=='S'){
					pos[++cnt].first=i,pos[cnt].second=j;
					b[i][j]=cnt;
				}
//				cout<<a[i][j]<<" ";
			}
//			cout<<endl;
		}
		for(int i=1;i<=cnt;i++){
//			cout<<i<<" : "<<pos[i].first<<" , "<<pos[i].second<<endl;
			for(int j=1;j<=cnt;j++){
				dist[i][j]=0x3f3f3f3f;
			}
		}
		for(int i=1;i<=cnt;i++){
			fa[i]=i;
			bfs(pos[i].first,pos[i].second,i);
			for(int j=1;j<=n;j++){
				for(int k=1;k<=m;k++){
					st[j][k]=false;
				}
			}
		}
		for(int i=1;i<=cnt;i++){
			for(int j=1;j<=cnt;j++){
				edge[++tot].x=i,edge[tot].y=j,edge[tot].leng=dist[i][j];
//				cout<<edge[tot].x<<" , "<<edge[tot].y<<" : "<<edge[tot].leng<<endl;
			}
		}
		sort(edge+1,edge+tot+1,cmp);
		int blocnt=cnt;
		for(int i=1;i<=tot;i++){
			if(blocnt==1){
				break;
			}
			int fx=find(edge[i].x),fy=find(edge[i].y);
			if(fx!=fy){
				hb(fx,fy);
				blocnt--;
				ans+=edge[i].leng;
//				cout<<pos[edge[i].x].first<<" , "<<pos[edge[i].x].second<<" -> "<<pos[edge[i].y].first<<" , "<<pos[edge[i].y].second<<" : "<<edge[i].leng<<endl;
			}
		}
		printf("%d\n",ans);
	}
	printf("\n");
}
2023/5/6 00:29
加载中...