2017.7.19 Race 思考记录

本文分享了一个未通过评测的ACM算法题目解决方案,涉及图论、深度优先搜索等技术。作者详细展示了代码实现,并寻求高手指点优化方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

    此题没有AC!!


但对拍了几个小时了,没有发现问题、、但就是过不了

如果有路过的dalao可以帮忙指导一下、、感激不尽


码(秒WA):

#include<iostream> 
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 200007
#define inf 1e9+7
int tot,zhong[N*2],v[N*2],hou[N*2],xia[N],d[N],sz[N],i,max1,rt,x,y,z,k,ans[N],n;
bool vis[N];
void jia(int x,int y,int z)
{
  ++tot,zhong[tot]=y,v[tot]=z,hou[tot]=xia[x],xia[x]=tot;		
}
void jian(int x,int y,int z)
{
	jia(x,y,z);
	jia(y,x,z);
}
struct lalala
{
	int d,ds;	
}q[100007];
void zzx(int o,int fu)
{ // cout<<o<<endl;
	sz[o]=1;
	int maxx=0;
	for(int i=xia[o];i!=-1;i=hou[i])
   {
     int nd=zhong[i];
     if(nd==fu||vis[nd])continue;
     zzx(nd,o);
     sz[o]+=sz[nd];
     maxx=max(maxx,sz[nd]);   
   }	
	maxx=max(maxx,tot-sz[o]);
	if(maxx<max1)max1=maxx,rt=o;	
}
void dfs(int o,int fu,int dis,int ddss)
{
q[++q[0].d].d=dis;
q[q[0].d].ds=ddss;	
d[o]=dis;
for(int i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fu||vis[nd])continue;
dfs(nd,o,dis+v[i],ddss+1);	
}		
}
bool cmp(lalala a,lalala b)
{
	return a.d<b.d;
}

void calc(int o,int fu)
{
	q[0].d=0;
	dfs(o,fu,0,0);
  sort(q+1,q+1+q[0].d,cmp);
   int l=1,r=q[0].d;
   while(l<r)
   {
   	if(q[l].d+q[r].d==k){ ans[q[l].ds+q[r].ds]++;  if(q[l+1].d+q[r].d==k)++l;else --r;   }   	
    else if(q[l].d+q[r].d<k)l++;
    else r--;
   }
}
void calc2(int o,int fu)
{
	q[0].d=0;
	dfs(o,fu,d[fu]-d[o],1);
  sort(q+1,q+1+q[0].d,cmp);
   int l=1,r=q[0].d;
   while(l<r)
   {
   	if(q[l].d+q[r].d==k){ ans[q[l].ds+q[r].ds]--;  if(q[l+1].d+q[r].d==k)++l;else --r;   }   	
    else if(q[l].d+q[r].d<k)l++;
    else r--;
   }
}

void work(int o,int fu)
{//cout<<"O";
	vis[o]=1;
 calc(o,fu);	
	for(int i=xia[o];i!=-1;i=hou[i])
	{
		int nd=zhong[i];
		if(nd==o||vis[nd])continue;
      calc2(nd,o);
      tot=sz[nd];
	  max1=inf;
	  zzx(nd,o);
	  work(nd,o);		
	}
}

int main()
{
	memset(xia,-1,sizeof(xia));
	scanf("%d%d",&n,&k);
for(i=1;i<n;i++)
{
	scanf("%d%d%d",&x,&y,&z);
	x++,y++;
	jian(x,y,z);	
}
max1=inf;
tot=n;
zzx(1,0);

work(rt,0);
for(i=1;i<=n;i++)
{
	if(ans[i]>0)
	{
		printf("%d",i);
		return 0;
	}
}
printf("-1");
}


内容概要:本文围绕直流微电网中带有恒功率负载(CPL)的DC/DC升压转换器的稳定控制问题展开研究,提出了一种复合预设性能控制策略。首先,通过精确反馈线性化技术将非线性不确定的DC转换器系统转化为Brunovsky标准型,然后利用非线性扰动观测器评估负载功率的动态变化和输出电压的调节精度。基于反步设计方法,设计了具有预设性能的复合非线性控制器,确保输出电压跟踪误差始终在预定义误差范围内。文章还对比了多种DC/DC转换器控制技术如脉冲调整技术、反馈线性化、滑模控制(SMC)、主动阻尼法和基于无源性的控制,并分析了它们的优缺点。最后,通过数值仿真验证了所提控制器的有效性和优越性。 适合人群:从事电力电子、自动控制领域研究的学者和工程师,以及对先进控制算法感兴趣的研究生及以上学历人员。 使用场景及目标:①适用于需要精确控制输出电压并处理恒功率负载的应用场景;②旨在实现快速稳定的电压跟踪,同时保证系统的鲁棒性和抗干扰能力;③为DC微电网中的功率转换系统提供兼顾瞬态性能和稳态精度的解决方案。 其他说明:文中不仅提供了详细的理论推导和算法实现,还通过Python代码演示了控制策略的具体实现过程,便于读者理解和实践。此外,文章还讨论了不同控制方法的特点和适用范围,为实际工程项目提供了有价值的参考。
内容概要:该论文介绍了一种名为偏振敏感强度衍射断层扫描(PS-IDT)的新型无参考三维偏振敏感计算成像技术。PS-IDT通过多角度圆偏振光照射样品,利用矢量多层光束传播模型(MSBP)和梯度下降算法迭代重建样品的三维各向异性分布。该技术无需干涉参考光或机械扫描,能够处理多重散射样品,并通过强度测量实现3D成像。文中展示了对马铃薯淀粉颗粒和缓步类动物等样品的成功成像实验,并提供了Python代码实现,包括系统初始化、前向传播、多层传播、重建算法以及数字体模验证等模块。 适用人群:具备一定光学成像和编程基础的研究人员,尤其是从事生物医学成像、材料科学成像领域的科研工作者。 使用场景及目标:①研究复杂散射样品(如生物组织、复合材料)的三维各向异性结构;②开发新型偏振敏感成像系统,提高成像分辨率和对比度;③验证和优化计算成像算法,应用于实际样品的高精度成像。 其他说明:PS-IDT技术相比传统偏振成像方法具有明显优势,如无需干涉装置、无需机械扫描、可处理多重散射等。然而,该技术也面临计算复杂度高、需要多角度数据采集等挑战。文中还提出了改进方向,如采用更高数值孔径(NA)物镜、引入深度学习超分辨率技术等,以进一步提升成像质量和效率。此外,文中提供的Python代码框架为研究人员提供了实用的工具,便于理解和应用该技术。
### Promise.all 和 Promise.race 的区别与使用场景 #### 1. **Promise.all 的用法** `Promise.all` 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。它会在所有传入的 Promise 都成功完成后才返回一个包含所有结果的数组[^3]。如果其中任何一个 Promise 被拒绝(rejected),则 `Promise.all` 会立即返回被拒绝的值,并忽略其他 Promise 的执行结果。 ```javascript let p1 = Promise.resolve('成功了'); let p2 = Promise.resolve('success'); Promise.all([p1, p2]).then((result) => { console.log(result); // 输出: ['成功了', 'success'] }).catch((error) => { console.log(error); }); ``` 如果其中一个 Promise 被拒绝,则 `Promise.all` 会直接进入 `catch` 分支,并输出第一个被拒绝的错误信息[^3]。 ```javascript let p1 = Promise.resolve('成功了'); let p2 = Promise.reject('失败'); Promise.all([p1, p2]).then((result) => { console.log(result); }).catch((error) => { console.log(error); // 输出: '失败' }); ``` #### 2. **Promise.race 的用法** `Promise.race` 方法同样接受一个 Promise 实例的数组作为参数,但它会返回第一个完成的 Promise 的结果,无论这个结果是成功还是失败[^2]。一旦有一个 Promise 完成,其余的 Promise 将被忽略。 ```javascript let p1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'A')); let p2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'B')); Promise.race([p1, p2]).then((result) => { console.log(result); // 输出: 'B',因为 p2 更快完成 }).catch((error) => { console.log(error); }); ``` 如果第一个完成的 Promise 是被拒绝的,则 `Promise.race` 会直接进入 `catch` 分支[^2]。 ```javascript let p1 = Promise.reject('Error'); let p2 = Promise.resolve('Success'); Promise.race([p1, p2]).then((result) => { console.log(result); }).catch((error) => { console.log(error); // 输出: 'Error',因为 p1 更快完成 }); ``` #### 3. **Promise.all 和 Promise.race 的区别** - **执行方式**: - `Promise.all` 等待所有 Promise 都完成,才会进入 `then` 分支[^3]。 - `Promise.race` 只需要一个 Promise 完成就会触发回调,无需等待其他 Promise[^2]。 - **返回结果**: - `Promise.all` 返回一个包含所有 Promise 结果的数组[^3]。 - `Promise.race` 返回第一个完成的 Promise 的结果,无论是成功还是失败[^2]。 - **错误处理**: - 在 `Promise.all` 中,只要有一个 Promise 被拒绝,整个操作就会失败并进入 `catch` 分支。 - 在 `Promise.race` 中,第一个完成的 Promise 决定了最终的结果,无论它是成功还是失败[^2]。 #### 4. **使用场景** - **Promise.all 的使用场景**: - 当需要同时发起多个异步请求,并且只有在所有请求都成功完成后才能继续下一步操作时,可以使用 `Promise.all`[^3]。 - 例如:从多个 API 获取数据后进行汇总分析。 - **Promise.race 的使用场景**: - 当需要从多个来源获取相同的数据,并选择最快返回的那个时,可以使用 `Promise.race`[^2]。 - 例如:向多个镜像服务器发送请求,哪个服务器先响应就使用哪个结果。 ### 示例代码 ```javascript // 使用 Promise.all let api1 = fetch('https://api.example.com/data1'); let api2 = fetch('https://api.example.com/data2'); Promise.all([api1, api2]).then((responses) => { return Promise.all(responses.map(response => response.json())); }).then((data) => { console.log(data); // 处理两个 API 的数据 }).catch((error) => { console.error(error); }); // 使用 Promise.race let fastApi1 = fetch('https://fast-api1.example.com/data'); let fastApi2 = fetch('https://fast-api2.example.com/data'); Promise.race([fastApi1, fastApi2]).then((response) => { return response.json(); }).then((data) => { console.log(data); // 使用最快返回的 API 数据 }).catch((error) => { console.error(error); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值