APIO T1求调
  • 板块学术版
  • 楼主doorhow
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/5/27 11:06
  • 上次更新2023/10/23 14:38:42
查看原帖
APIO T1求调
695011
doorhow楼主2023/5/27 11:06

RT.

Code:

#include<queue>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iostream>
#include<cmath>
#define ll long long
#define pi 3.1415926535897
#define mi3(a,b,c) min(a,min(b,c))
#define ma3(a,b,c) max(a,max(b,c))
#define F(a,b,c) for(int a=b;a<=c;a++)
#define f(a,b,c) for(int a=b;a>=c;a--)
#define WH(a) while(a)
#define CO continue
#define BR break
#define pb emplace_back
#define INF 0x3f3f3f3f
#define pii pair<int, int>

using namespace std;

template<typename T> inline void read(T& x)
{
    x = 0;
    int f = 1;
    char ch = getchar();
    for (;ch < '0' || ch > '9';ch = getchar()) if(ch == '-') f = 0;
    for (; ch >= '0' && ch <= '9';ch = getchar()) x = x*10+ch-48;
    if (!f) x = -x;
}

template<typename T> inline T read()
{
    T x = 0;
    int f = 1;
    char ch = getchar();
    for (;ch < '0' || ch > '9';ch = getchar()) if(ch == '-') f = 0;
    for (; ch >= '0' && ch <= '9';ch = getchar()) x = x*10+ch-48;
    if (!f) x = -x;
    return x;
}

struct edge{
	int v, w;
};

struct stat11111111{
	int u, l;
};

double solve(int n, int m, int k, int h, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr);

#ifndef ONLINE_JUDGE
int main() {
  int T;
  assert(1 == scanf("%d", &T));
  while (T--){
    int N,M,K,H;
    assert(4 == scanf("%d %d %d\n%d", &N, &M, &K, &H));
    std::vector<int> x(M);
    std::vector<int> y(M);
    std::vector<int> c(M);
    std::vector<int> arr(N);
    for (int i=0;i<N;i++)
      assert(1 == scanf("%d", &arr[i]));
    for (int i=0;i<M;i++)
      assert(3 == scanf("%d %d %d", &x[i], &y[i], &c[i]));
    printf("%.12lf\n", solve(N, M, K, H, x, y, c, arr));
  }
}
#endif

double solve(int n, int m, int k, int h, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
	double dis[100009][109];
	vector<edge> g[100009]; 
	F(i,0,m-1){
		g[x[i]].pb((edge){y[i], c[i]});
		g[y[i]].pb((edge){x[i], c[i]});
	} 
	F(i,0,n-1){
		F(j,0,k){
			dis[i][j]=INF;
		}
	}
	queue<stat11111111> q;
	q.push((stat11111111){0, 0});
	dis[0][0] = 0;
	while(!q.empty()){
		int u = q.front().u;
		int l = q.front().l;
		q.pop();
		if(u == h) continue;
		if(arr[u] == 0) dis[u][l] = 0;
		for(auto et : g[u]){
			if(dis[et.v][l] > dis[u][l] + et.w){
				dis[et.v][l] = dis[u][l] + et.w;
				q.push({et.v, l});
			}
			if(arr[et.v] == 2 && l<k && dis[et.v][l+1] > (dis[u][l] + et.w)/2.0){
				dis[et.v][l+1] = (dis[u][l] + et.w)/2.0;
				q.push({et.v, l+1});
			}
		}
	}
	double res = INF;
	F(i,0,k){
		res = min(res, dis[h][i]);
	}
	if(res - INF > 1e-12) return -1;
	return res;
}

Record:

2023/5/27 11:06
加载中...