| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
拆点1A,Dinic,留念#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int oo = 0x3f3f3f3f;
int V;
struct edge {
int to, cap, rev;
};
vector<edge> G[202];
int iter[202];
int level[202];
void add_edge(int from, int to, int cap) {
G[from].push_back((edge) {
to, cap, G[to].size()
} );
G[to].push_back( (edge) {
from, 0, G[from].size() - 1
});
}
void bfs(int s) {
memset(level, -1, sizeof(level));
level[s] = 0;
queue<int> que;
que.push(s);
while(!que.empty()) {
int v = que.front();
que.pop();
for(int i = 0; i < G[v].size(); i ++) {
edge & e = G[v][i];
if(e.cap > 0 && level[e.to] < 0) {
level[e.to] = level[v] + 1;
que.push(e.to);
}
}
}
}
int dfs(int v, int t, int f) {
if(v == t) {
return f;
}
for(int & i = iter[v]; i < G[v].size(); i ++) {
edge & e = G[v][i];
if(e.cap > 0 && level[e.to] > level[v]) {
int d = dfs(e.to, t, min(f, e.cap));
if(d > 0) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
int max_flow(int s, int t) {
int flow = 0;
while(true) {
bfs(s);
if(level[t] < 0) {
return flow;
}
memset(iter, 0, sizeof(iter));
int f;
while((f = dfs(s, t, oo)) > 0) {
flow += f;
}
}
}
double Dist(int x1, int y1, int x2, int y2) {
return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
int X[100], Y[100], N[100], D[100];
int M, Sum;
double max_d;
void Build() {
for(int i = 0; i < V; i ++){
G[i].clear();
}
int s = M * 2;
for(int i = 0; i < M; i ++) {
add_edge(s, i, N[i]);
add_edge(i, M + i, D[i]);
}
for(int i = 0; i < M; i ++) {
for(int j = i + 1; j < M; j ++) {
if(Dist(X[i], Y[i], X[j], Y[j]) <= max_d) {
add_edge(M + i, j, oo);
add_edge(M + j, i, oo);
}
}
}
}
int main() {
int Num;
scanf("%d", &Num);
for(int num = 0; num < Num; num ++) {
scanf("%d %lf", &M, &max_d);
Sum = 0;
for(int i = 0; i < M; i ++) {
scanf("%d %d %d %d", X + i, Y + i, N + i, D + i);
Sum += N[i];
}
V = M * 2 + 1;
int s = 2 * M;
int c= 0;
for(int i = 0; i < M; i ++){
int t = i;
Build();
if(max_flow(s, t) == Sum){
printf("%d ", i);
c++;
}
}
if(c == 0){
printf("-1");
}
puts("");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator