求助分层图 63pts WA on #2,3,10,11
  • 板块灌水区
  • 楼主a_little_carrot
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/21 21:47
  • 上次更新2024/11/22 09:25:03
查看原帖
求助分层图 63pts WA on #2,3,10,11
1042960
a_little_carrot楼主2024/11/21 21:47

Problem

Code

#include "bits/stdc++.h"
using namespace std ;
struct Node
{
	int num, dis ;
	friend bool operator <(Node a, Node b)
	{
		return a.dis > b.dis ;
	}
} ;
const int N = 100010 ;
int n, m, k, dis[N << 6], ans = 0x3f3f3f3f ;
priority_queue<Node> q ;
int weight[N << 8], head[N << 8], to[N << 8], pre[N << 8], vis[N], cnt ;
void add(int u, int v, int w)
{
	pre[++cnt] = head[u], head[u] = cnt ;
	to[cnt] = v, weight[cnt] = w ;
}
void dij()
{
	memset(dis, 0x3f, sizeof(dis)) ;
	q.push(Node{1, 0}) ;
	dis[1] = 0 ;
	while(!q.empty())
	{
		Node u = q.top() ; q.pop() ;
		if(vis[u.num]) continue ;
		for(int v = head[u.num] ; v ; v = pre[v])
		{
			if(dis[to[v]] > dis[u.num] + weight[v])
			{
				dis[to[v]] = dis[u.num] + weight[v] ;
				q.push((Node){to[v], dis[to[v]]}) ;
			}
		}
	}
}
int main()
{
//	freopen("D:/GPT浏览器下载/P2939_2.in", "r", stdin) ;
	ios::sync_with_stdio(false) ;
	cin.tie(0) ; cout.tie(0) ;
	cin >> n >> m >> k ;
	for(int i = 1, u, v, w ; i <= m ; ++i)
	{
		cin >> u >> v >> w ;
		add(u, v, w), add(v, u, w) ;
		for(int j = 1 ; j <= k ; ++j)
		{
			add(n * j + u, n * j + v, w) ;
			add(n * j + v, n * j + u, w) ;       // 建立 u <-> v 未升级
			add(n * (j - 1) + u, n * j + v, 0) ; // 建立 u -> v 已升级
			add(n * (j - 1) + v, n * j + u, 0) ; // 建立 v -> u 已升级
		}
	}
	dij() ;
	for(int i = 0 ; i <= k ; ++i)
	{
		ans = min(ans, dis[n * i + n]) ;
	}
	cout << ans ;
	return 0 ;
}
2024/11/21 21:47
加载中...