50 分求助
查看原帖
50 分求助
392787
Doma_Umaru楼主2022/3/21 20:24

参考了目前的第二篇题解(原本思路是Astar但是想了想发现太耗时了),调了半个晚修但是没调好,难受啊,恳请大佬帮助。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define N 50500
#define M 1000100
#define inf (1e18)
ll n, m, head[N], limit, in[N], cnt = 0;
ll x, y, z;
ll dis[5][N];
bool vis[N];
struct Edge{
  ll to, nxt, val;
}e[M << 2];
inline void add_edge(ll u, ll v, ll w) {
  e[++cnt].to = v;
  e[cnt].val = w;
  e[cnt].nxt = head[u];
  head[u] = cnt;
}
void init() {
  for(re ll i = 2; i < n; i++) {
    for(ll j = head[i]; j; j = e[j].nxt) {
      if(!vis[e[j].to]) {
	    in[i]++;
	    vis[e[j].to] = 1;
	  }
    }
	memset(vis, 0, sizeof(vis));
	dis[1][i] = dis[2][i] = inf;
  }
  in[1] = in[n] = inf;
  dis[1][n] = dis[2][n] = inf;
}
void SPFA() {
  queue <ll> Q;
  Q.push(1);
  dis[1][1] = 0; dis[2][1] = inf;
  while(!Q.empty()) {
    ll u = Q.front();
    Q.pop();
    vis[u] = 0;
    for(ll j = head[u]; j; j = e[j].nxt) {
      if(in[e[j].to] < limit) continue;
      if(dis[1][e[j].to] > dis[1][u] + e[j].val) {
        dis[2][e[j].to] = dis[1][e[j].to];
        dis[1][e[j].to] = dis[1][u] + e[j].val;
        if(!vis[e[j].to]) { Q.push(e[j].to); vis[e[j].to] = 1;}
	  }
	  
	  else if(dis[2][e[j].to] > dis[1][u] + e[j].val && dis[1][e[j].to] < dis[1][u] + e[j].val) {
	    dis[2][e[j].to] = dis[1][u] + e[j].val;
	   if(!vis[e[j].to]) { Q.push(e[j].to); vis[e[j].to] = 1;}
	  }
	  
	  else if(dis[2][e[j].to] > dis[2][u] + e[j].val && dis[1][e[j].to] < dis[2][u] + e[j].val) {
	    dis[2][e[j].to] = dis[2][u] + e[j].val;
	    if(!vis[e[j].to]) { Q.push(e[j].to); vis[e[j].to] = 1;}
	  }
	}
  }
}
int main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	std :: cin >> n >> m >> limit;
	for(re ll i = 1; i <= m; i++) {
	  std :: cin >> x >> y >> z;
	  add_edge(x, y, z);
	  add_edge(y, x, z);
	}
	init();
	SPFA();
	std :: cout << (dis[2][n] == inf ? -1 : dis[2][n]);
	return 0;
}
2022/3/21 20:24
加载中...