有食物与饮料两个限制条件 之前还在想怎么连边
后来想到可以s与食物连边 流量为食物数量 饮料与t连 流量为饮料数量 这样问题就完美解决了 然后食物与人连 人与饮料连 流量为1 其中人要拆点 来控制人的数量 两个点之间连流量为1
写错了个小细节之前
#include<cstdio>
#include<string>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e3 + 10;
map<string, int> M;
char s[maxn * 100];
string x, y;
int n, t, z, f;
struct point
{
int l[31], r[31], flag;
void read()
{
flag = 1;
for (int i = 1; i <= 30; i++) l[i] = -10001, r[i] = 10001;
gets(s);
for (int i = 0; s[i]; )
{
if (s[i] == ' ' || s[i] == ',') { i++; continue; }
x = ""; y = ""; z = 0; f = 1;
while (s[i] != ' ') x += s[i++];
while (s[i] == ' ') ++i;
while (s[i] != ' ') y += s[i++];
while (s[i] == ' ') ++i;
if (s[i] == '-') ++i, f = -1;
while (s[i] >= '0'&&s[i] <= '9') z = z * 10 + s[i++] - '0';
z = z*f;
int now = M[x];
if (!now) now = M[x] = ++t;
if (y == "<") r[now] = min(r[now], z - 1);
else if (y == ">") l[now] = max(l[now], z + 1);
else if (y == "<=") r[now] = min(r[now], z);
else if (y == ">=") l[now] = max(l[now], z);
else l[now] = max(l[now], z), r[now] = min(r[now], z);
if (l[now] > r[now]) flag = 0;
}
}
}a[maxn];
bool check(point a, point b)
{
if (a.flag + b.flag != 2) return false;
for (int i = 1; i <= t; i++)
{
if (max(a.l[i], b.l[i]) > min(a.r[i], b.r[i])) return false;
}
return true;
}
int main()
{
while (scanf("%d", &n) != EOF)
{
gets(s);
M.clear(); t = 0;
for (int i = 1; i <= n; i++) a[i].read();
for (int i = 1; i <= n; i++)
{
int flag = 0;
for (int j = 1; j < i; j++)
{
if (check(a[i], a[j]))
{
if (flag) printf(" ");
printf("%d", j);
flag = 1;
}
}
if (!flag) printf("unique");
printf("\n");
}
}
return 0;
}