rt,第二问的爆搜的回溯写炸了,求神犇帮助
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge
{int v,w,nxt;}e[900010];
int n,m,tot,a,b,num1,num2,ans;
int head[600010],d[600010],c[600010],l[600010],mp[600010];
void add(int u,int v,int w)
{
e[++tot].v=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot;
}
struct node
{
int u,d;
bool operator <(const node& r) const {return d>r.d;}
}f[600010];
void zdl(int s)
{
priority_queue<node>q;
for(int i=1;i<=n;i++) d[i]=1e18;
d[s]=0;
q.push((node){s,0});
while(!q.empty())
{
node p=q.top();
q.pop();
if(p.d!=d[p.u]) continue;
for(int i=head[p.u];i;i=e[i].nxt)
if(d[p.u]+e[i].w<d[e[i].v])
d[e[i].v]=d[p.u]+e[i].w,q.push((node){e[i].v,d[e[i].v]});
}
}
void dfs(int x,int sum,int sb)
{
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].v;
if(f[v].d==sb&&f[v].u!=sum) return ;
mp[v]=1;
if(l[i+1]/2==-1) l[(i+1)/2]=i%2+1;
else l[i]=0;
dfs(v,sum+e[i].w,sb);
}
}
int read()
{
char c=getchar();int x=0;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
signed main()
{
//freopen("corridor4.in","r",stdin);
n=read(),a=read(),b=read(),m=n-1;
for(int i=1,x,y,z;i<=m;i++)
{
x=read(),y=read(),z=read();
add(x,y,z);add(y,x,z);
}
zdl(a);
for(int i=1;i<=n;i++) c[i]=d[i],l[i]=-1;
zdl(b);
for(int i=1;i<=n;i++)
{
if(d[i]<c[i]) f[i].u=d[i],f[i].d=1;
else f[i].u=c[i],f[i].d=0;
ans+=f[i].u;
}
cout<<ans<<endl;
dfs(a,0,0);
dfs(b,0,1);
for(int i=1;i<=m;i++) cout<<l[i];
return 0;
}