結果
| 問題 |
No.654 Air E869120
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-09-18 11:11:59 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,178 bytes |
| コンパイル時間 | 547 ms |
| コンパイル使用メモリ | 73,888 KB |
| 実行使用メモリ | 57,472 KB |
| 最終ジャッジ日時 | 2024-07-18 07:55:13 |
| 合計ジャッジ時間 | 5,299 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 25 WA * 10 |
ソースコード
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<utility>
#include<queue>
#include<string.h>
#include<string>
#include<set>
#include<iostream>
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
typedef queue<P> Q;
#include<vector>
using namespace std;
const int MAX_V = 1001;
const int INF = 2000000000;
struct edge {
int to;//行先
int capacity;//容量
int reverse;//逆辺
};
vector<edge> G[MAX_V*2000];
bool used[MAX_V*2000];
void AddEdge(int from, int to, int capacity) {
G[from].push_back(edge{ to, capacity, (int)G[to].size() });
G[to].push_back(edge{ from,0,(int)G[from].size() - 1 });
}
LL dfs(int v, int t, LL f) {
if (v == t) {
return f;
}
used[v] = true;
for (int i = 0; i < G[v].size(); i++) {
edge &e = G[v][i];
if (!used[e.to] && e.capacity > 0) {//使える辺を見つけたら
int d = dfs(e.to, t, min(f, (LL)e.capacity));
if (d>0) {
e.capacity -= d;
G[e.to][e.reverse].capacity += d;
return d;
}
}
}
return 0;
}
LL max_flow(int s, int t) {
int flow = 0;
while (true) {
memset(used, 0, sizeof(used));
int f = dfs(s, t, INF);
if (f == 0) {
return flow;
}
else {
flow += f;
}
}
}
#define _CRT_SECURE_NO_WARNINGS
int N,M,d = 0;
LL ans = 0;
int u[MAX_V], v[MAX_V], p[MAX_V], q[MAX_V], w[MAX_V];
const int MAX_DEG = 1001;
int outdeg[MAX_V] = {};
int startTime[MAX_V][MAX_DEG];
int indeg[MAX_V] = {};
int goalTime[MAX_V][MAX_DEG];
int main() {
cin >> N >> M >> d;
for (int i = 0; i < M;i++) {
cin >> u[i] >> v[i] >> p[i] >> q[i] >> w[i];
AddEdge(u[i] * 2000 + 1000+outdeg[u[i]], v[i] * 2000 + indeg[v[i]], w[i]);
startTime[ u[i] ][ outdeg[u[i]] ] = p[i];
goalTime[v[i]][indeg[v[i]]] = q[i];
outdeg[u[i]]++;
indeg[v[i]]++;
}
for (int i = 1; i <= N;i++) {
for (int j = 0; j < indeg[i];j++) {
for (int k = 0; k < outdeg[i];k++) {
if ( goalTime[i][j]+d <= startTime[i][k] ) {
AddEdge(i * 2000 + j, i * 2000+1000 + k, INF);
}
}
}
}
for (int i = 0; i < outdeg[1];i++) {
AddEdge(0, 2000 +1000+ i, INF);
}
for (int i = 0; i < indeg[N];i++) {
AddEdge(N * 2000 + i, 1, INF);
}
cout << max_flow(0, 1) << endl;
return 0;
}