CF 543B 图,最短路

本文介绍了一个关于最短路径的问题,该问题来源于CodeForces平台,涉及图论中的最短路径算法。文章提供了一种解决方案,通过使用邻接矩阵预计算所有顶点间的最短距离,进而解决如何在限制条件下删除最多数量的边以满足特定路径长度要求。

题目链接:http://codeforces.com/problemset/problem/543/B


题意:总共有n个点(1<= n<=3000),m条边(m <= min(3000,n * (n - 1) / 2)),任意两点间只有一条边,边的长度都为1,一开始的时候所有点都能通过某些路径到达。要你求最多删除几条边,能使s1到t1的距离不超过l1,s2到t2的距离不超过l2,如果情况不存在,输出-1,否则输出最多删的边的条数。


思路:看到点的个数比较少,可以先把所有i到j的最短路算出来,并用邻接矩阵存起来,O(n^2)复杂度。接下来只要考虑两种情况:1.s1到t1和s2到t2的路径中没有重合的边,那么只要单独算两条路径的最短路即可。2.从两条路径的一个端点出发,路径中会出现先没有边重合,后来有边重合,最后又没有边重合的情况。对于第2种情况,只要枚举重合路径的两个端点,然后不断更新答案就可以了。

另外需要特别注意的是,两个路径可能是从s1,s2出发(t1,t2也一样。。。)或者是s1,t2出发(s2,t1也一样。。。),这是两种不同的情况要分开考虑,所以还要swap(s1,t1)才能AC。。。。


#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
const int maxn = 3005;
int dis[maxn][maxn];
vector<int> vec[maxn];

int n,m;
void bfs(int x)
{
	queue<int> que;
	dis[x][x] = 0;
	que.push(x);
	while(!que.empty())
	{
		int temp = que.front();
		que.pop();
		for(int i = 0;i < vec[temp].size();i++)
		{
			int v = vec[temp][i];
			if(dis[x][v] == -1)
			{
				dis[x][v] = dis[x][temp] + 1;
				que.push(v);
			}
		}
	}
}
int s[2],t[2],l[2];

void show()
{
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= n;j++)
			cout<<dis[i][j]<<" ";
		cout<<endl;
	}
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		mem(dis,-1);
		for(int i = 0;i <= n + 1;i++)vec[i].clear();
		for(int i = 0,a,b;i < m;i++)
		{
			scanf("%d%d",&a,&b);
			vec[a].push_back(b);
			vec[b].push_back(a);
		}
		for(int i = 1;i <= n;i++)
			bfs(i);
		scanf("%d%d%d%d%d%d",&s[0],&t[0],&l[0],&s[1],&t[1],&l[1]);
		int ans = 999999999;
		for(int oper = 0;oper < 2;oper++)
		{
			swap(s[1],t[1]);
			for(int i = 1;i <= n;i++)
				for(int j = 1;j <= n;j++)
				{
					int v[] = {dis[s[0]][i] + dis[i][j] + dis[j][t[0]],dis[s[1]][i] + dis[i][j] + dis[j][t[1]]};
					if(v[0] <= l[0] && v[1] <= l[1])
					{
						ans = min(ans,v[0] + v[1] - dis[i][j]);
					}
				}
		}
		if(dis[s[0]][t[0]] <= l[0] && dis[s[1]][t[1]] <= l[1])
			ans = min(ans,dis[s[0]][t[0]] + dis[s[1]][t[1]]);
		if(ans > m)
			ans = -1;
		else 
			ans = m - ans;
		printf("%d\n",ans);
	}
}


<think>嗯,用户想了解PMSM在发生匝间短路故障时的数学模型。这个问题挺专业的,应该是电气工程或电机控制领域的研究者或工程师提出的。从用户引用的内容看,ta已经具备PMSM基础模型的知识,现在需要扩展到故障工况分析。 匝间短路是PMSM常见故障之一,建模时需要重点考虑三个物理变化:绕组结构不对称导致的电感变化、故障引入的额外电流通路、以及由此产生的空间谐波。用户可能关心的是故障电流计算和转矩脉动分析,因为这对故障诊断和保护策略设计很关键。 在数学处理上,核心难点在于故障破坏了绕组的对称性,导致传统的d-q变换失效。这里需要采用绕组函数法重新推导电感矩阵,同时引入故障环流作为新变量。参考IEEE Trans. on Energy Conversion那篇论文的处理方式,可以把短路匝看作独立支路,通过磁动势等效建立多回路方程。 用户可能没明说但隐含的需求是:这个模型能否直接用于仿真?所以我在推导时特意保留了微分方程形式,并补充了MATLAB代码框架。考虑到故障建模的复杂性,还额外提供了三个相关问题供深入研究方向选择,特别是故障特征提取这个点,对实际工程诊断很有价值。 要注意的是,匝间短路程度(短路匝数占比)会显著影响模型精度。如果用户后续追问,可能需要补充关于故障程度参数化建模的内容。</think>当PMSM发生单相匝间短路故障时,其数学模型需在健康模型基础上引入故障特征。以下是关键建模步骤和方程: ### 一、故障特征分析 1. **电气不对称** 短路匝形成闭合回路,产生故障环流$i_f$,破坏三相绕组对称性 2. **磁路变化** 短路相电感下降,磁链分布畸变,产生谐波分量 3. **转矩脉动** 故障导致电磁转矩出现$2\omega$频率脉动 ### 二、数学模型推导 #### 1. 电压方程(扩展克希霍夫定律) 三相电压方程修正为: $$ \begin{cases} v_a = R_s i_a + \frac{d\psi_a}{dt} + R_f i_f \\ v_b = R_s i_b + \frac{d\psi_b}{dt} \\ v_c = R_s i_c + \frac{d\psi_c}{dt} \end{cases} $$ 其中$R_f$为短路电阻,$i_f$为故障环流 #### 2. 磁链方程(考虑磁耦合) $$ \begin{bmatrix} \psi_a \\ \psi_b \\ \psi_c \\ \psi_f \end{bmatrix} = \begin{bmatrix} L_{aa} & L_{ab} & L_{ac} & L_{af} \\ L_{ba} & L_{bb} & L_{bc} & L_{bf} \\ L_{ca} & L_{cb} & L_{cc} & L_{cf} \\ L_{fa} & L_{fb} & L_{fc} & L_{ff} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \\ i_f \end{bmatrix} + \psi_m \begin{bmatrix} \cos\theta_r \\ \cos(\theta_r-120^\circ) \\ \cos(\theta_r+120^\circ) \\ k_f\cos\theta_r \end{bmatrix} $$ $k_f$为故障绕组磁链系数($0<k_f<1$) #### 3. 故障环流方程 $$ \frac{di_f}{dt} = \frac{1}{L_{ff}} \left[ k_f \frac{d\psi_m}{dt} - R_f i_f - \sum_{k=a,b,c} L_{fk} \frac{di_k}{dt} \right] $$ #### 4. 机电方程 $$ T_e = \frac{P}{2} \left[ \psi_m (i_q + k_f i_f) + (L_d - L_q)i_d i_q \right] + T_{\text{ripple}} \\ J \frac{d\omega}{dt} = T_e - T_L - B\omega $$ 其中$T_{\text{ripple}}$为故障引起的转矩脉动项 ### 三、仿真模型实现要点 ```matlab % 故障参数定义 k_f = 0.3; % 短路匝占比 R_f = 0.5; % 短路电阻 function dydt = pmsm_fault(t,y) % 解包状态变量 i_dq = y(1:2); i_f = y(3); ω = y(4); θ = y(5); % 时变电感矩阵计算 L_mat = calc_fault_inductance(θ, k_f); % 自定义函数计算故障电感 % 故障环流微分方程 di_f = (k_f*dψm/dt - R_f*i_f - L_mat(4,1:3)*di_abc)/L_mat(4,4); % 电磁转矩计算(含脉动项) T_e = 1.5*P*(ψm*i_q + (L_d-L_q)*i_d*i_q) + ... 0.5*P*k_f*ψm*i_f*sin(2*θ); % 状态导数 dydt = [di_d; di_q; di_f; dω; dθ]; end ``` ### 四、故障特征物理表现 1. **电流频谱特征** 定子电流出现特征谐波:$f_{\text{fault}} = f_s \pm 2kf_r$ 2. **零序分量** $\frac{di_0}{dt} = \frac{1}{3L_0} \left( v_0 - 3R_s i_0 - k_f \frac{d\psi_m}{dt} \right)$ 3. **局部过热** 损耗密度分布:$p_{\text{loss}} = \frac{(k_f i_f \omega L_d)^2}{\sigma A_c}$ > 注:实际建模需考虑饱和效应、漏磁及热耦合的影响[^1]。故障程度参数$k_f$可通过离线测量或在线参数辨识获得。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值