测试点对的都对了,剩下的都超时了,求调~~~~~
查看原帖
测试点对的都对了,剩下的都超时了,求调~~~~~
1046694
DanGo113楼主2024/3/3 11:22
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
struct Edge
{
	int st,to,nxt,w;
}edge[N << 1];
int head[N];
long long cnt,sum;
bool vis[N];
queue<int> q;
void add(int x,int y,int w)
{
	edge[++cnt].to = y;
	edge[cnt].st = x;
	edge[cnt].w = w;
	edge[cnt].nxt = head[x];
	head[x]=cnt;
}
long long bfs(int u)
{
	int st=edge[u].st;
	int to=edge[u].to;
	int w=edge[u].w;
	vis[st]=vis[to]=1;
	long long left=1,right=1;
	q.push(st);
	while(!q.empty())
	{
		int x=q.front();
		vis[x]=1;
		q.pop();
		for(int i=head[x];i;i=edge[i].nxt)
		{
			if(edge[i].to == to)	continue;
			if(vis[edge[i].to]==0)	
			{
				left+=1;
				q.push(edge[i].to);
			}
		}
	}
     	q.push(to);
	while(!q.empty())
	{
		int x=q.front();
		vis[x]=1;
		q.pop();
		for(int i=head[x];i;i=edge[i].nxt)
		{
			if(edge[i].to == st)	continue;
			if(vis[edge[i].to]==0)	
			{
				right+=1;
				q.push(edge[i].to);
			}
		}
	}
	return abs(right-left) * w;
}
int main()
{
	int n;
	scanf("%d",&n);
	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);
	}
	for(int i=1;i<=2*(n-1);i+=2)
	{
		memset(vis,false,sizeof(vis));
		sum+=bfs(i);
	}
	printf("%lld",sum);
	return 0;
}
2024/3/3 11:22
加载中...