我自闭了,萌新求教!
查看原帖
我自闭了,萌新求教!
238572
神山识楼主2020/6/28 08:47

只A了环的30分,xtbl,求教。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300005,P=19260817;
struct edge{int to,w,nxt;}e[N<<1];
int n,tot,cnt,head[N],cir[N],siz[N],w[N];char vis[N];
ll sum,ans;
inline ll fst(ll x,int q) {ll r=1;for(;q;q>>=1,(x*=x)%=P) if(q&1) (r*=x)%=P;return r%P;}
inline void adde(int x,int y,int w) {e[++tot]=(edge){y,w,head[x]},head[x]=tot;}
inline int fndc(int x,int fa=-1)
{//找环
	if(vis[x]) return x;else vis[x]=-1;
	for(int i=head[x],t;i;i=e[i].nxt)
		if(e[i].to!=fa)
		{
			t=fndc(e[i].to,x);
			if(t) return vis[x]=1,cir[++cnt]=e[i].to,w[cnt]=e[i].w,t!=x?t:0;
		}
	return 0;
}
inline void dfs(int x,int fa=-1)
{//dfs求siz
	siz[x]=1;
	for(int i=head[x];i;i=e[i].nxt) if(e[i].to!=fa&&vis[e[i].to]!=1) dfs(e[i].to,x),siz[x]+=siz[e[i].to];
}
inline void dp(int x,int fa=-1)
{//求每颗子树里的边的贡献
	for(int i=head[x];i;i=e[i].nxt)
		if(e[i].to!=fa&&vis[e[i].to]!=1)
		{
			ans+=1ll*e[i].w*siz[e[i].to]%P*(n-siz[e[i].to])%P*2%P,ans%=P;
			dfs(e[i].to,x);
		}
}
signed main()
{
//	freopen("in.txt","r",stdin);
	scanf("%d",&n),tot=0,memset(head,0,sizeof(head)),memset(vis,0,sizeof(vis));
	for(int i=1,x,y,we;i<=n;i++) scanf("%d%d%d",&x,&y,&we),adde(x,y,we),adde(y,x,we);
	cnt=0,fndc(1),memset(siz,0,sizeof(siz)),sum=1ll*n*n%P,ans=0;
	for(int i=1;i<=cnt;i++) dfs(cir[i]);
	for(int i=1;i<=cnt;i++) sum-=(siz[cir[i]]-1)*(siz[cir[i]]-1)%P;
	for(int i=1;i<=cnt;i++) ans+=w[i],ans%=P;
	sum+=P,sum%=P,ans*=sum,ans%=P,ans*=fst(2,P-2),ans%=P;
	for(int i=1;i<=cnt;i++) dp(cir[i]);
	ans*=fst(1ll*n*n%P,P-2),ans%=P,printf("%lld\n",ans);
	return 0;
}

感觉一点问题都没有啊,求巨佬帮忙康康/wq

2020/6/28 08:47
加载中...