POJ 3255 Roadblocks 次短路

本文介绍了一种求解从起点到终点次短路径的方法,通过两次Dijkstra算法结合遍历所有边的方式找到次短路径长度。适用于道路网络中寻找次优方案的问题。

http://poj.org/problem?id=3255

题目大意:

有N条道路和N个路口,道路是双向的,问1号路口到N号路口的次最短路径是多少?次最短路径是比最短路径长的次短的路径。同一条边可已经过多次。

思路:

最短路和次短路不会重合,而次短路可以从最短路的某个点绕一个点得到。为啥是一个点?如果绕两个点的话会比绕一个点来的长,就不会是次短路了。

先对1和n为源点进行两次dijkstra,接下来枚举每条边,则可以算出此时的和temp=dis1[from]+disn[to]+val;或者temp=disn[from]+dis1[to]+val;如果不等于最短路则取最小值。



#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=5000+10;
const int MAXM=200000+10;
const int INF=0x3fffffff;
int n,r,head[MAXN],len,dis1[MAXN],disn[MAXN];
struct edge
{
	int to,val,next;
}e[MAXM];
void add(int from,int to,int val)
{
	e[len].to=to;
	e[len].val=val;
	e[len].next=head[from];
	head[from]=len++;
}
struct node
{
	int id,val;
	node(int id,int val):id(id),val(val){}
	bool operator < (const node &x)const{
		return val>x.val;
	}
};
void dijkstra(int *dis,int s)
{
	for(int i=1;i<=n;i++)
		dis[i]=INF;
	dis[s]=0;
	priority_queue<node> q;
	q.push(node(s,0));
	while(!q.empty())
	{
		int cur=q.top().id,val=q.top().val;
		q.pop();
		for(int i=head[cur];i!=-1;i=e[i].next)
		{
			int id=e[i].to;
			if(dis[id] > dis[cur]+e[i].val)
			{
				dis[id]=dis[cur]+e[i].val;
				q.push(node(id,dis[id]));
			}		
		}
	}
}
int main()
{
	while(~scanf("%d%d",&n,&r))
	{
		memset(head,-1,sizeof(head));
		len=0;
		for(int i=0;i<r;i++)
		{
			int from,to,val;
			scanf("%d%d%d",&from,&to,&val);
			add(from,to,val);
			add(to,from,val);
		}
		dijkstra(dis1,1);
		dijkstra(disn,n);
		//printf("%d %d\n",dis1[n],disn[1]);

		int ans=INF;
		for(int cur=1;cur<=n;cur++)
		{
			for(int i=head[cur];i!=-1;i=e[i].next)
			{
				int from=cur,to=e[i].to,val=e[i].val;
				int temp=dis1[from]+disn[to]+val;
				if(temp!=dis1[n] && temp <ans)
					ans=temp;
				temp=disn[from]+dis1[to]+val;
				if(temp!=dis1[n] && temp <ans)
					ans=temp;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}


【SCI复现】基于纳什博弈的多微网主体电热双层共享策略研究(Matlab代码实现)内容概要:本文围绕“基于纳什博弈的多微网主体电热双层共享策略研究”展开,结合Matlab代码实现,复现了SCI级别的科研成果。研究聚焦于多个微网主体之间的能源共享问题,引入纳什博弈理论构建双层优化模型,上层为各微网间的非合作博弈策略,下层为各微网内部电热联合优化调度,实现能源高效利用与经济性目标的平衡。文中详细阐述了模型构建、博弈均衡求解、约束处理及算法实现过程,并通过Matlab编程进行仿真验证,展示了多微网在电热耦合条件下的运行特性和共享效益。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识的研究生、科研人员及从事能源互联网、微电网优化等相关领域的工程师。; 使用场景及目标:① 学习如何将纳什博弈应用于多主体能源系统优化;② 掌握双层优化模型的建模与求解方法;③ 复现SCI论文中的仿真案例,提升科研实践能力;④ 为微电网集群协同调度、能源共享机制设计提供技术参考。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注博弈均衡的求解过程与双层结构的迭代逻辑,同时可尝试修改参数或扩展模型以适应不同应用场景,深化对多主体协同优化机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值