解题思路:
题目要求是否存在集合S使得 Y < X ,因此让T集合中点数目尽量少,使得Y尽量小,枚举即可。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <map>
#include <algorithm>
#define LL long long
#define FOR(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int maxn = 200 + 10;
int B[maxn][maxn];
int D[maxn][maxn];
int main()
{
int T , kcase = 1;
int N , M;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
memset(B,0,sizeof(B));
memset(D,0,sizeof(D));
int u , v , b , d;
for(int i=1;i<=M;i++)
{
scanf("%d%d%d%d",&u,&v,&b,&d);
B[u][v] = b;
D[u][v] = d;
}
int F = 0;
for(int i=1;i<=N;i++)
{
int x = 0 , y = 0;
for(int j=1;j<=N;j++)
{
x += B[i][j] + D[i][j];
y += B[j][i];
}
if(x < y) { F = 1; break;}
}
if(F) printf("Case #%d: unhappy\n",kcase++);
else printf("Case #%d: happy\n",kcase++);
}
return 0;
}