您的位置:首页 > 大数据 > 人工智能

Aizu - 2555 Everlasting Zero 模拟

2015-08-22 23:44 459 查看
Aizu - 2555 Everlasting Zero

题意:学习技能,每个技能有不同的要求,问能否学习全部特殊技能

思路:枚举每两个技能,得到他们的先后学习关系,如果两个都不能先学的话就是No了,如果A>B,B>C,但是并没有A>C那么这种情况也是不允许的了,我过的也是比较惊险。

#pragma comment(linker, "/STACK:1000000000")
#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt", "w", stdout);
using namespace std;
#define MAXN 105
#define MAXM 25005

bool dayu[MAXN][MAXN], vis[MAXN][MAXN][MAXN];
int in[MAXN];
queue<int> Q;
int gao[MAXN][MAXN], di[MAXN][MAXN];
int main()
{
//IN;
int m, n, k, x, y;
char s[5];
scanf("%d%d", &m, &n);
memset(di, 0, sizeof(di));
memset(gao, INF, sizeof(gao));
for(int i = 1; i <= m; i++){
scanf("%d", &k);
for(int j = 1; j <= k; j++){
scanf("%d%s%d", &x, &s, &y);
if(s[0] == '<'){
gao[i][x] = min(gao[i][x], y);
}
else{
di[i][x] = max(di[i][x], y);
}
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(di[i][j] > gao[i][j]){
printf("No\n");
return 0;
}
}
}
memset(dayu, 0, sizeof(dayu));
memset(in, 0, sizeof(in));
for(int i = 1; i <= m; i++){
for(int j = 1; j <= m; j++){
if(i == j) continue;
bool flag = false;
for(int k = 1; k <= n; k++){
if(di[i][k] > gao[j][k]){
flag = true;
break;
}
}
if(!flag){
dayu[i][j] = true;
in[j]++;
}
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= m; j++){
for(int k = 1; k <= m; k++){
if(i == j || i == k || j == k) continue;
if(dayu[i][j] && dayu[i][k] && dayu[k][j]){
vis[i][j][k] = true;
vis[i][k][j] = true;
vis[j][i][k] = true;
vis[j][k][i] = true;
vis[k][i][j] = true;
vis[k][j][i] = true;
}
}
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= m; j++){
for(int k = 1; k <= m; k++){
if(i == j || i == k || j == k) continue;
if(vis[i][j][k]) continue;
printf("No\n");
return 0;
}
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= m; j++){
if(i == j) continue;
if(!dayu[i][j] && !dayu[j][i]){
printf("No\n");
return 0;
}
}
}
printf("Yes\n");
return 0;
/* memset(vis, 0, sizeof(vis));
while(!Q.empty()){
Q.pop();
}
for(int i = 1; i <= m; i++){
bool flag = false;
for(int j = 1; j <= m; j++){
if(dayu[i][j] || i == j) continue;
flag = true;
break;
}
if(!flag){
Q.push(i);
vis[i] = true;
}
}
int ans = 0;

while(!Q.empty()){
int s = Q.front();
vis[s] = true;
ans++;
Q.pop();
for(int i = 1; i <= m; i++){
if(dayu[s][i]){
in[i]--;
if(in[i] == 0 && !vis[i]){
Q.push(i);
}
}
}
}
if(ans == m){
printf("Yes\n");
}
else{
printf("No\n");
}*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: