60pts第二问爆搜回溯求帮助
查看原帖
60pts第二问爆搜回溯求帮助
551100
Hoks楼主2022/9/5 13:58

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;
}
2022/9/5 13:58
加载中...