为什么会溢出?
查看原帖
为什么会溢出?
190314
lixiaoqian楼主2022/9/4 21:28
#include <cstdio>
#include <algorithm>
#include <cstring>
// #define int long long
using namespace std ;
const int N=600010 ;
int e[N],ne[N],h[N],w[N],idx ;
long long dis[2][N] ;
inline void add(int a,int b,int c) { e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++ ; }
int n,s,t ;
int fa[N] ;
int dir[N] ;
void dfs(long long d[],int u,int f)
{
	// printf("%d\n",u) ;
    for(int i=h[u];~i;i=ne[i]) if(e[i]!=f) d[e[i]]=d[u]+w[i],dfs(d,e[i],u) ;
}
void dfs1(int u,int f,int st,int ed)
{
	// printf("%d %d %d %d---\n",u,f,st,ed) ;
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i] ;
        if(j!=f&&(u!=st||j!=ed)&&(u!=ed||j!=st)) fa[j]=u,dfs1(j,u,st,ed) ;
    }
}
long long dfs2(int u,int f,int st,int ed,int fath)
{
	// printf("---%d %d %d %d %d\n",u,f,st,ed,fath) ;
    int res=0 ;
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i] ;
        if(j==st&&u==ed) continue ;
        if(j==ed&&u==st) continue ;
		if(j==fath) continue ;
// 		printf("--%d %d %d\n",i,u,j) ;
        dir[i>>1]=(i&1?1:2) ;
        res+=dis[f][j]+dfs2(j,f,st,ed,u) ;
    }
    return res ;
}
int main()
{
	memset(h,-1,sizeof h) ;
    scanf("%d%d%d",&n,&s,&t) ;
    for(int i=1;i<n;i++)
    {
        int a,b,c ;
        scanf("%d%d%d",&a,&b,&c) ;
        add(a,b,c),add(b,a,c) ;
    }
    dfs(dis[0],s,-1),dfs(dis[1],t,-1) ;
    dfs1(s,-1,-1,-1) ;
    int now=t ;
    while(now!=s&&dis[1][fa[now]]<=dis[0][fa[now]]) now=fa[now] ;
    printf("%lld\n",dfs2(s,0,now,fa[now],-1)+dfs2(t,1,now,fa[now],-1)) ;
    for(int i=0;i<n-1;i++) printf("%d",dir[i]) ;
    return 0 ;
}

很明显地可以看出 这个代码在某些地方的结果是负数 这是为什么?

尝试过用unsigned long long了 但是还是做不出 用long long是为了让效果看起来比较明显qwq

2022/9/4 21:28
加载中...