求助
查看原帖
求助
760171
Binah_cyc楼主2024/3/2 19:56

为什么代码会在第93行崩溃?

#include<bits/stdc++.h>
using namespace std;
#define int long long
int _,n,m,s,cnt,sum,ans,maxedge[35],maxedgeval[35],best[35],maxtree[35],vispoint[35];
map<string,int> mp;
int head[35],tot,head2[35],tot2;
struct Node
{
	int nxt,to,val;
} edge[1005],edge2[1005];
void add(int u,int v,int w)
{
	edge[++tot]=Node {head[u],v,w},head[u]=tot;
}
void add2(int u,int v,int w)
{
	edge2[++tot2]=Node {head2[u],v,w},head2[u]=tot2;
}
struct Edge
{
	int x,y,val;
};
vector<Edge> ed;
bool operator<(Edge a,Edge b)
{
	return a.val<b.val;
}
int fa[35],fa2[35];
int ask(int a)
{
	return ((fa[a]==a)?a:fa[a]=ask(fa[a]));
}
int ask2(int a)
{
	return ((fa2[a]==a)?a:fa2[a]=ask2(fa2[a]));
}
bool vis[35];
void dfs(int now,int maxval)
{
	best[now]=max(best[now],maxval);
	for(int i=head2[now]; i; i=edge2[i].nxt) if(!vis[edge2[i].to]) vis[edge2[i].to]=1,dfs(edge2[i].to,max(maxval,edge2[i].val));
}
signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>_;
	while(_--)
	{
		memset(head,0,sizeof(head));
		memset(head2,0,sizeof(head2));
		memset(vispoint,0,sizeof(vispoint));
		memset(maxedge,0x7f,sizeof(maxedge));
		tot=tot2=ans=0,cnt=1;
		mp.clear();
		mp["Park"]=1;
		cin>>m;
		for(int i=1; i<=m; i++)
		{
			string x,y;
			int k;
			cin>>x>>y>>k;
			if(!mp[x]) mp[x]=++cnt;
			if(!mp[y]) mp[y]=++cnt;
			add(mp[x],mp[y],k);
			add(mp[y],mp[x],k);
			if(x!="Park"&&y!="Park") ed.push_back(Edge {mp[x],mp[y],k}),fa[ask(mp[x])]=ask(mp[y]);
		}
		for(int i=1; i<=cnt; i++) fa[i]=i,fa2[i]=i;
		cin>>s;
		sort(ed.begin(),ed.end());
		for(auto i:ed) if(ask2(i.x)!=ask2(i.y)) fa2[ask2(i.x)]=ask2(i.y),ans+=i.val,add2(i.x,i.y,i.val),add2(i.y,i.x,i.val);
		vector<int> roots;
		roots.clear();
		for(int i=1; i<=cnt; i++) if(fa2[i]==i&&i!=1) sum++,roots.push_back(i);
		for(int i:roots)
		{
			int maxval=INT_MAX,maxto;
			for(int j=head[1]; j; j=edge[j].nxt) if(ask2(edge[j].to)==i&&edge[j].val<maxval) maxval=edge[j].val,maxto=edge[j].to;
			ans+=maxval,add2(1,maxto,maxval),add2(maxto,1,maxval);
			vispoint[maxto]=1;
		}
		maxtree[sum]=ans;
		int num=maxtree[sum];
		for(int i=sum+1; i<=s; i++)
		{
			memset(vis,0,sizeof(vis));
			memset(best,0,sizeof(best));
			dfs(1,-INT_MAX);
			int maxval=INT_MAX,maxto;
			for(int j=head[1]; j; j=edge[j].nxt) if(edge[j].val-best[edge[j].to]<maxval)
					if(!vispoint[edge[j].to])
						maxval=edge[j].val-best[edge[j].to],maxto=edge[j].to;
			ans+=maxval;
			vispoint[maxto]=1;
			add2(1,maxto,maxval);
			add2(maxto,1,maxval);
			maxtree[i]=maxtree[i-1]+maxval;
			num=min(num,maxtree[i]);
		}
		printf("Total miles driven: %d\n",num);
		puts("");
	}
	return 0;
}
2024/3/2 19:56
加载中...