| ||||||||||
| 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 | |||||||||
int溢出变成负数了,差错一下午才发现,魂淡阿#include<cstdio>
#include<climits>
#include<queue>
#include<cstring>
#include<cmath>
//using namespace std;
#define ll long long
const int MAX_V = 202, MAX_N = 101;
int X[MAX_N], Y[MAX_N], B[MAX_N], P[MAX_N], Q[MAX_N], C[MAX_N], E[MAX_N][MAX_N], g[MAX_V][MAX_V],
prev[MAX_V][MAX_V];
bool used[MAX_V];
int main()
{
int n, m, V;
scanf("%d%d", &n, &m);
V = n + m + 1;
for (int i = 0; i < n; ++i)
scanf("%d%d%d", &X[i], &Y[i], &B[i]);
for (int i = 0; i < m; ++i)
scanf("%d%d%d", &P[i], &Q[i], &C[i]);
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
scanf("%d", &E[i][j]);
std::fill(g[0], g[MAX_V], 5000);
for (int i = 0; i < V; ++i)
g[i][i] = 0;
for (int j = 0; j < m; ++j)
{
int sum = 0;
for (int i = 0; i < n; ++i)
{
int c = abs(X[i] - P[j]) + abs(Y[i] - Q[j]) + 1;
g[i][n + j] = c;
if (E[i][j] > 0)
g[n + j][i] = -c;
sum += E[i][j];
}
if (sum > 0)
g[n + m][n + j] = 0;
if (sum < C[j])
g[n + j][n + m] = 0;
}
for (int i = 0; i < V; ++i)
for (int j = 0; j < V; ++j)
prev[i][j] = i;
for (int k = 0; k < V; ++k)
{
for (int i = 0; i < V; ++i)
{
for (int j = 0; j < V; ++j)
{
if (g[i][j] > g[i][k] + g[k][j])
{
g[i][j] = g[i][k] + g[k][j];
prev[i][j] = prev[k][j];
if (i == j && g[i][i] < 0)
{
memset(used, 0, sizeof(used));
for (int v = i; !used[v]; v = prev[i][v])
{
used[v] = true;
if (v != n + m && prev[i][v] != n + m)
{
if (v >= n)
++E[prev[i][v]][v - n];
else
--E[v][prev[i][v] - n];
}
}
puts("SUBOPTIMAL");
for (int x = 0; x < n; ++x)
for (int y = 0; y < m; ++y)
printf("%d%c", E[x][y], y == m - 1 ? '\n' : ' ');
return 0;
}
}
}
}
}
puts("OPTIMAL");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator