codeforces567E. President and Roads

传送门:http://codeforces.com/problemset/problem/567/E

思路:正着做一遍最短路,反着做一遍最短路,然后就可以判断一条边是否在最短路径图上了

设这条边为从a到b权值为c,那么如果dis[st][a]+c+dis[b][ed]=mindis,则在最短路径图上。

如果一条边是最短路图的桥,那么这就是必经边,

对于非必经边,就看减到多少才会使dis[st][a]+c+dis[b][ed]<mindis,

如果小于0,输NO,否则这条路就可修。

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define PI pair<ll,ll>
#define mp(a,b) make_pair(a,b)
#define fi first
#define se second
const int maxn=200010,maxm=400010,maxq=maxn*5;
using namespace std;
typedef long long ll;
ll n,m,st,ed,pre[3][maxm],now[3][maxn],son[3][maxm],val[3][maxm],frm[3][maxm],tot[3];
ll q[maxq+10],head,tail,top;ll dis[3][maxn],mindis,ans[maxm];
bool bo[maxn],must[maxn],ins[maxn],in[maxm],use[maxm];//must 一定在最短路上,in在最短路图上 
ll tim,dfn[maxn],low[maxn],bcnt,bel[maxn];

void add(ll a,ll b,ll c,ll id){
	pre[id][++tot[id]]=now[id][a];
	now[id][a]=tot[id];
	frm[id][tot[id]]=a;
	son[id][tot[id]]=b;
	val[id][tot[id]]=c;
}
bool operator >(PI a,PI b){
	if (a.fi!=b.fi) return a.fi<b.fi;
	return a.se<b.se;
}

/*void spfa(ll c){
	memset(dis[c],63,sizeof(dis[c]));
	memset(bo,0,sizeof(bo));
	if (!c) q[tail=1]=st,bo[st]=1,dis[c][st]=0;
	else q[tail=1]=ed,bo[ed]=1,dis[c][ed]=0;
	head=0;
	while (head!=tail){
		if (++head>maxq) head=1;
		ll x=q[head];
		for (ll y=now[c][x];y;y=pre[c][y]){
			ll xx=son[c][y];
			if (dis[c][xx]>dis[c][x]+val[c][y]){
				dis[c][xx]=dis[c][x]+val[c][y];
				if (!bo[xx]){
					if (++tail>maxq) tail=1;
					q[tail]=xx,bo[xx]=1;
				}
			}
		}
		bo[x]=0;
	}
	if (!c) mindis=dis[c][ed];
	//printf("%d\n",mindis);
}*/
bool cmp(PI a,PI b){return a>b;}

void dijkstra(ll c){
	memset(dis[c],63,sizeof(dis[c]));
	//memset(bo,0,sizeof(bo));
	priority_queue< PI,vector<PI>,greater<PI> > q;
	if (!c) q.push(mp(0,st)),dis[c][st]=0;
	else q.push(mp(0,ed)),dis[c][ed]=0;
	while (!q.empty()){
		ll x=q.top().se,d=q.top().fi;
		q.pop();
		for (ll y=now[c][x];y;y=pre[c][y]){
			ll xx=son[c][y];
			if (dis[c][xx]>d+val[c][y]){
				dis[c][xx]=d+val[c][y];
				q.push(mp(dis[c][xx],xx));
			}
		}
	}
	if (!c) mindis=dis[c][ed];
	//printf("%d\n",mindis);
}

void rebuild(){
	for (ll i=1;i<=m;i++){
		ll a=frm[0][i],b=son[0][i],c=val[0][i];
		if (dis[0][a]+dis[1][b]+c==mindis)
			in[i]=1,add(a,b,c,2),add(b,a,c,2);
	}
}

void tarjan(ll x,ll fa){
	dfn[x]=low[x]=++tim,q[++top]=x,ins[x]=1;
	for (ll y=now[2][x];y;y=pre[2][y]){
		if (use[y]) continue;
		ll xx=son[2][y];
		use[y]=use[y^1]=1;
		if (!dfn[xx]) tarjan(xx,x),low[x]=min(low[x],low[xx]);
		else if (ins[xx]) low[x]=min(low[x],dfn[xx]);
	}
	if (low[x]==dfn[x]){
		ll xx;bcnt++;
		do{
			xx=q[top--],bel[xx]=bcnt,ins[xx]=0;
		}while (xx!=x);
	}
}

void work(){
	for (ll i=1;i<=m;i++){
		if (!in[i]) continue;
		ll a=frm[0][i],b=son[0][i];
		if (bel[a]!=bel[b]) must[i]=1;
	}
	for (ll i=1;i<=m;i++){
		if (must[i]) continue;
		ll a=frm[0][i],b=son[0][i];
		ans[i]=mindis-dis[0][a]-dis[1][b]-1;
	}
	for (ll i=1;i<=m;i++){
		if (must[i]) puts("YES");
		else if (ans[i]>0) printf("CAN %I64d\n",val[0][i]-ans[i]);
		else puts("NO");
	}
}

int main(){
	scanf("%I64d%I64d%I64d%I64d",&n,&m,&st,&ed);tot[2]=1;
	for (ll i=1,a,b,c;i<=m;i++) scanf("%I64d%I64d%I64d",&a,&b,&c),add(a,b,c,0),add(b,a,c,1);
	dijkstra(0),dijkstra(1),rebuild(),tarjan(st,0),work();
	return 0;
}


数据集介绍:电力线目标检测数据集 一、基础信息 数据集名称:电力线目标检测数据集 图片数量: 训练集:2898张图片 验证集:263张图片 测试集:138张图片 总计:3299张图片 分类类别: 类别ID: 0(电力线) 标注格式: YOLO格式,包含对象标注信息,适用于目标检测任务。 数据格式:JPEG/PNG图片,来源于空中拍摄或监控视觉。 二、适用场景 电力设施监控与巡检: 数据集支持目标检测任务,帮助构建能够自动识别和定位电力线的AI模型,用于无人机或固定摄像头巡检,提升电力设施维护效率和安全性。 能源与公用事业管理: 集成至能源管理系统中,提供实时电力线检测功能,辅助进行风险 assessment 和预防性维护,优化能源分配。 计算机视觉算法研究: 支持目标检测技术在特定领域的应用研究,促进AI在能源和公用事业行业的创新与发展。 专业培训与教育: 数据集可用于电力行业培训课程,作为工程师和技术人员学习电力线检测与识别的重要资源。 三、数据集优势 标注精准可靠: 每张图片均经过专业标注,确保电力线对象的定位准确,适用于高精度模型训练。 数据多样性丰富: 包含多种环境下的电力线图片,如空中视角,覆盖不同场景条件,提升模型的泛化能力和鲁棒性。 任务适配性强: 标注格式兼容YOLO等主流深度学习框架,便于快速集成和模型开发,支持目标检测任务的直接应用。 实用价值突出: 专注于电力线检测,为智能电网、自动化巡检和能源设施监控提供关键数据支撑,具有较高的行业应用价值。
【弹簧阻尼器】基于卡尔曼滤波弹簧质量阻尼器系统噪声测量实时状态估计研究(Matlab代码实现)内容概要:本文围绕“基于卡尔曼滤波的弹簧质量阻尼器系统噪声测量与实时状态估计”展开研究,利用Matlab代码实现对系统状态的精确估计。重点在于应用卡尔曼滤波技术处理系统中存在的噪声干扰,提升对弹簧质量阻尼器系统动态行为的实时观测能力。文中详细阐述了系统建模、噪声特性分析及卡尔曼滤波算法的设计与实现过程,展示了滤波算法在抑制测量噪声、提高状态估计精度方面的有效性。同时,该研究属于更广泛的信号处理与状态估计技术应用范畴,适用于复杂动态系统的监控与控制。; 适合人群:具备一定控制系统理论基础和Matlab编程经验的高校研究生、科研人员及工程技术人员,尤其适合从事动态系统建模、状态估计与滤波算法研究的相关人员。; 使用场景及目标:①应用于机械、航空航天、自动化等领域中对振动系统状态的高精度实时估计;②为噪声环境下的传感器数据融合与状态预测提供算法支持;③作为卡尔曼滤波算法在实际物理系统中应用的教学与科研案例。; 阅读建议:建议读者结合Matlab代码实践,深入理解系统建模与滤波器设计的关键步骤,关注噪声建模与滤波参数调优对估计性能的影响,并可进一步拓展至扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)在非线性系统中的应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值