牛客月赛11-Rinne Loves Dynamic Graph-(函数分析+分层图)

博客探讨了一道涉及图论算法的最短路径问题,其中边权通过特定函数转换。作者提示应避免复杂的化简,直接利用三层图结构进行动态规划求解。代码展示了如何构建分层图并使用Dijkstra算法找到从1到n的最短路径。当边权为负时,使用绝对值处理。最后,提供了完整的C++代码实现。
摘要由CSDN通过智能技术生成

H

题意:
就是给你一个图,然后每次你走过一个边,其余的边都变成f(x)=1/(1-x)。问你从1到n的最短路。然后如果是负边权那么就设置成fabs,就是绝对值之和最小的那个最短路。

思考:
看完我感觉这咋做啊,那么复杂,其实这种函数,你连动手化简化简都不化简。其实化简之后发现就有三种状态,所以就是建立分层图就可以了。跑一遍distra。

代码:

int T,n,m,k;
int va[N];
int vis[N];
db dist[N];

vector<pair<int,db> > e[N];

void distra()
{
	for(int i=1;i<=3*n;i++) dist[i] = inf;
	priority_queue<PII,vector<PII>,greater<PII> > q;
	q.push({0,1});
	dist[1] = 0;
	while(q.size())
	{
		auto t = q.top();
		q.pop();
		int now = t.se;
		db dis = t.fi;
		if(vis[now]) continue;
		vis[now] = 1;
		for(auto tt:e[now])
		{
			int spot = tt.fi;
			db w = tt.se;
			if(dist[spot]>dis+w)
			{
				dist[spot] = dis+w;
				q.push({dist[spot],spot});
			}
		}
	}
}

signed main()
{
	IOS;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int a,b;
		db c;
		cin>>a>>b>>c;
		e[a].pb({b+n,c});
		e[b].pb({a+n,c});
		c = 1.0/(1-c);
		e[a+n].pb({b+2*n,fabs(c)});
		e[b+n].pb({a+2*n,fabs(c)});
		c = 1.0/(1-c);
		e[a+2*n].pb({b,fabs(c)});
		e[b+2*n].pb({a,fabs(c)});
	}
	distra();
	db minn = inf;
	for(int i=1;i<=3;i++)
	minn = min(minn,dist[i*n]);
	if(minn==inf) printf("-1\n");
	else printf("%.3lf",minn);
	return 0;
}

总结:
多多思考呀,积累积累经验。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值