为什么代码会在第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;
}