提出 #579289


ソースコード 拡げる

#include <cassert>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

static const auto VMAX = 200;
static const auto INF = 1000000000;

typedef int w_t;
struct EDGE {
	int v; w_t c; int i;
	EDGE(int v,w_t c,int i):v(v),c(c),i(i) {}
};
namespace Network
{

	int V,S,T;//TODO
	vector<EDGE> f[VMAX];
	int d[VMAX];
	static int i[VMAX];

	static w_t push(int u,w_t r)
	{
		if(u==T)return r;
		const w_t o=r;
		for(;i[u]!=f[u].size();i[u]++)
		{
			if(f[u][i[u]].c==0)continue;
			const int v=f[u][i[u]].v;
			if(d[v]!=d[u]+1||i[v]==f[v].size())continue;
			const w_t w=push(v,min(r,f[u][i[u]].c));
			if(w==0)continue;
			f[u][i[u]].c-=w;
			f[v][f[u][i[u]].i].c+=w;
			if((r-=w)==0)break;
		}
		return o-r;
	}

	static bool bfs()
	{
		int qh=0,qt=0;
		memset(d,0xFF,V*sizeof(int));
		d[S]=0;i[qt++]=S;
		do
		{
			const int u=i[qh++];
			vector<EDGE>::const_iterator it;
			for(it=f[u].begin();it!=f[u].end();++it)
			{
				if(it->c==0||d[it->v]>=0)continue;
				d[it->v]=d[u]+1;
				if(it->v==T)return true;
				i[qt++]=it->v;
			}
		} while(qh!=qt);
		return false;
	}

	w_t flow()
	{
		w_t ret=0;
		while(bfs())
		{
			memset(i,0x00,V*sizeof(int));
			ret+=push(S,INF);
		}
		return ret;
	}

	inline void insert(int a,int b,w_t cab,w_t cba)
	{
		f[a].push_back(EDGE(b,cab,f[b].size()  ));
		f[b].push_back(EDGE(a,cba,f[a].size()-1));
	}

	void clear()
	{
		for(int i=0;i<V;i++)vector<EDGE>().swap(f[i]);
	}
}

static int &V = Network::V, B, &S = Network::S, &T = Network::T;
static int D[VMAX];

struct CDE {
	int v, c, d; bool i;
	CDE(int v, int c, int d) : v(v), c(c), d(d) {}
};

static vector<CDE> E[VMAX];
static bool R[VMAX];

static void dfs(int u) {
	R[u] = true;
	for(auto &e : Network::f[u]) if(e.c != 0 && !R[e.v]) dfs(e.v);
}

static void dfs() {
	fill(R, R + V, false);
	dfs(S);
}

static void Dijkstra(bool ig) {
	static bool F[VMAX];
	fill(D, D + V, INF);
	fill(F, F + V, false);
	D[S] = 0;
	for(; ; ) {
		auto u = -1;
		for(auto i = 0; i < V; i++) {
			if(!F[i] && D[i] != INF && (u < 0 || D[i] < D[u])) u = i;
		}
		if(u < 0) break;
		F[u] = true;
		for(auto &cde : E[u]) {
			if(ig && cde.i) continue;
			if(D[u] + cde.d < D[cde.v]) D[cde.v] = D[u] + cde.d;
		}
	}
}

static double solve() {
	for(; ; ) {
//printf("B = %d\n", B);
		Dijkstra(false);
		auto d1 = D[T];
//printf("d1 = %d\n", d1);
		if(B == 0) return d1;
		for(auto u = 0; u < V; u++) {
			for(auto &cde : E[u]) {
				if(D[u] + cde.d == D[cde.v]) {
					Network::insert(u, cde.v, cde.c, 0);
				}
			}
		}
		auto f = Network::flow();
//printf("f = %d\n", f);
		dfs();
		Network::clear();
		for(auto u = 0; u < V; u++) {
			for(auto &cde : E[u]) cde.i = R[u] && !R[cde.v] && D[u] + cde.d == D[cde.v];
//for(auto &cde : E[u]) if(cde.i) printf("%d->%d (c=%d d=%d) in cut\n", u + 1, cde.v + 1, cde.c, cde.d);
		}
		Dijkstra(true);
		auto d2 = D[T];
//printf("d2 = %d\n", d2);
		if(d2 == INF || (B + (f - 1) / f) <= d2 - d1) return d1 + (double)B / f;
		B -= (d2 - d1) * f;
		for(auto u = 0; u < V; u++) {
			for(auto &cde : E[u]) if(cde.i) cde.d += d2 - d1;
		}
	}
}

static void input() {
	int m;
	scanf("%d%d%d%d%d", &V, &m, &B, &S, &T); S--; T--;
	while(--m >= 0) {
		int a, b, c, d;
		scanf("%d%d%d%d", &a, &b, &d, &c); a--; b--;
		E[a].emplace_back(b, c, d);
	}
}

int main() {
	input();
	printf("%.15f\n", solve());
	return 0;
}

提出情報

提出日時
問題 J - Longest Shortest Path
ユーザ arosusti
言語 C++11 (GCC 4.8.1)
得点 0
コード長 3531 Byte
結果 WA
実行時間 92 ms
メモリ 1004 KiB

コンパイルエラー

./Main.cpp: In function ‘void input()’:
./Main.cpp:160:41: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d%d", &V, &m, &B, &S, &T); S--; T--;
                                         ^
./Main.cpp:163:36: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d", &a, &b, &d, &c); a--; b--;
                                    ^

ジャッジ結果

セット名 All
得点 / 配点 0 / 100
結果
AC × 20
WA × 36
セット名 テストケース
All 00_example_00, 00_example_01, 00_example_02, 05_kill_00, 05_kill_01, 05_kill_02, 10_rand_small_000, 10_rand_small_001, 10_rand_small_002, 10_rand_small_003, 10_rand_small_004, 11_rand_medium_000, 11_rand_medium_001, 11_rand_medium_002, 11_rand_medium_003, 11_rand_medium_004, 12_rand_large_000, 12_rand_large_001, 12_rand_large_002, 12_rand_large_003, 12_rand_large_004, 15_rand_small_000, 15_rand_small_001, 15_rand_small_002, 15_rand_small_003, 15_rand_small_004, 20_parallel_small_000, 20_parallel_small_001, 20_parallel_small_002, 20_parallel_small_003, 20_parallel_small_004, 22_parallel_large_000, 22_parallel_large_001, 22_parallel_large_002, 22_parallel_large_003, 22_parallel_large_004, 32_bigDist_large_000, 32_bigDist_large_001, 32_bigDist_large_002, 32_bigDist_large_003, 32_bigDist_large_004, 42_bigCost_large_000, 42_bigCost_large_001, 42_bigCost_large_002, 42_bigCost_large_003, 42_bigCost_large_004, 50_gen_rand_000, 50_gen_rand_001, 50_gen_rand_002, 50_gen_rand_003, 50_gen_rand_004, 52_gen_rand_000, 52_gen_rand_001, 52_gen_rand_002, 52_gen_rand_003, 52_gen_rand_004
ケース名 結果 実行時間 メモリ
00_example_00 AC 26 ms 920 KiB
00_example_01 AC 27 ms 872 KiB
00_example_02 AC 25 ms 920 KiB
05_kill_00 AC 25 ms 924 KiB
05_kill_01 WA 27 ms 800 KiB
05_kill_02 WA 26 ms 920 KiB
10_rand_small_000 AC 26 ms 924 KiB
10_rand_small_001 WA 26 ms 920 KiB
10_rand_small_002 AC 25 ms 796 KiB
10_rand_small_003 WA 26 ms 924 KiB
10_rand_small_004 AC 23 ms 928 KiB
11_rand_medium_000 AC 26 ms 916 KiB
11_rand_medium_001 WA 25 ms 928 KiB
11_rand_medium_002 AC 24 ms 916 KiB
11_rand_medium_003 WA 25 ms 924 KiB
11_rand_medium_004 WA 25 ms 920 KiB
12_rand_large_000 WA 86 ms 924 KiB
12_rand_large_001 WA 92 ms 920 KiB
12_rand_large_002 WA 82 ms 928 KiB
12_rand_large_003 WA 84 ms 924 KiB
12_rand_large_004 WA 77 ms 872 KiB
15_rand_small_000 AC 24 ms 928 KiB
15_rand_small_001 AC 24 ms 920 KiB
15_rand_small_002 WA 25 ms 928 KiB
15_rand_small_003 AC 25 ms 916 KiB
15_rand_small_004 AC 25 ms 924 KiB
20_parallel_small_000 AC 24 ms 884 KiB
20_parallel_small_001 WA 24 ms 924 KiB
20_parallel_small_002 AC 23 ms 800 KiB
20_parallel_small_003 AC 24 ms 920 KiB
20_parallel_small_004 WA 24 ms 924 KiB
22_parallel_large_000 WA 50 ms 924 KiB
22_parallel_large_001 WA 49 ms 920 KiB
22_parallel_large_002 WA 51 ms 928 KiB
22_parallel_large_003 WA 36 ms 916 KiB
22_parallel_large_004 WA 48 ms 924 KiB
32_bigDist_large_000 WA 61 ms 932 KiB
32_bigDist_large_001 WA 81 ms 920 KiB
32_bigDist_large_002 WA 77 ms 920 KiB
32_bigDist_large_003 WA 83 ms 940 KiB
32_bigDist_large_004 WA 77 ms 916 KiB
42_bigCost_large_000 WA 37 ms 924 KiB
42_bigCost_large_001 WA 36 ms 924 KiB
42_bigCost_large_002 WA 38 ms 924 KiB
42_bigCost_large_003 WA 38 ms 1004 KiB
42_bigCost_large_004 WA 38 ms 872 KiB
50_gen_rand_000 AC 24 ms 924 KiB
50_gen_rand_001 AC 24 ms 924 KiB
50_gen_rand_002 AC 25 ms 860 KiB
50_gen_rand_003 WA 25 ms 920 KiB
50_gen_rand_004 AC 23 ms 920 KiB
52_gen_rand_000 WA 78 ms 912 KiB
52_gen_rand_001 WA 43 ms 920 KiB
52_gen_rand_002 WA 67 ms 916 KiB
52_gen_rand_003 WA 70 ms 920 KiB
52_gen_rand_004 WA 73 ms 924 KiB