vector<P>g[N];
ll d[N];
bool vis[N];
void solve()
{
for(int i=0;i<N;i++)
g[i].clear(),
vis[i]=0,
d[i]=0;
cin>>n>>m;
for(int i=0;i<m;i++)
{
ll u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});//附近的汤圆,粘度
g[v].push_back({u,w});
d[u]+=w;
d[v]+=w;
}
set<P>st;ans=0;
for(int i=1;i<=n;i++)
{
st.insert({d[i],i});//汤圆的重量,汤圆编号
}
set<P>::iterator it;
while(st.empty()==0)
{
it=st.begin();
st.erase(it);//夹走
P res=*it;
vis[res.sd]=1;//标记夹走
ans=max(ans,res.ft);
for(int i=0;i<g[res.sd].size();i++)//遍历夹走汤圆接触的汤圆
{
ll w=g[res.sd][i].ft;//汤圆
if(vis[w]==1)continue;//夹走了
st.erase({d[w],w});//未夹走,删掉之前的记录
d[w]-=g[res.sd][i].sd;//减去夹走的粘度
st.insert({d[w],w});//新增
}
}
cout<<ans<<'\n';
}
一整个大模拟,很精妙。
尤其是STL容器的使用。