BZOJ 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜( 差分约束 )

枚举每头牛, 假设它在说谎, 建图判圈就行了...为啥水题都没人来写..

------------------------------------------------------------------

#include<bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

const int maxn = 109;

struct edge {

int to, w;

edge(int _t, int _w):to(_t), w(_w) {}

};

vector<edge> G[maxn];

vector<pii> cow[maxn];

bool vis[maxn], F;

int d[maxn], N;

void dfs(int x) {

vis[x] = true;

for(vector<edge>::iterator e = G[x].begin(); e != G[x].end(); e++) if(d[e->to] <= d[x] + e->w) {

if(!vis[e->to]) {

d[e->to] = d[x] + e->w;

dfs(e->to);

} else

F = true;

if(F) break;

}

vis[x] = false;

}

void init() {

memset(vis, false, sizeof vis);

int q;

cin >> N >> q;

while(q--) {

int c, u, v;

scanf("%d%d%d", &c, &u, &v);

c--; u--; v--;

cow[c].push_back(make_pair(u, v));

}

}

void work() {

int ans = 0;

for(int i = 0; i < N; i++) {

memset(d, 0, sizeof d);

F = false;

for(int j = 0; j < N; j++)

G[j].clear();

for(vector<pii>::iterator it = cow[i].begin(); it != cow[i].end(); it++)

G[it->first].push_back(edge(it->second, 0));

for(int j = 0; j < N; j++) if(j != i)

for(vector<pii>::iterator it = cow[j].begin(); it != cow[j].end(); it++)

G[it->second].push_back(edge(it->first, 1));

for(int j = 0; j < N; j++) {

if(F) break;

dfs(j);

}

if(!F) ans++;

}

cout << ans << "\n";

}

int main() {

init();

work();

return 0;

}

------------------------------------------------------------------

3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 24  Solved: 8
[Submit][Status][Discuss]

Description

兽群中总是有一些麻烦制造者.约翰知道他的N(1≤N≤100)头奶牛中有一头总是说谎,其他的总是说真话.他想快速的找出这个麻烦制造者.为了实现这个目标,他一个一个的问这些奶牛Q(1≤Q≤1000)个关于它们吃草的简单问题(虽然大多数奶牛是诚实的但它们依旧很笨只能懂得一些关于食物的话题).

他将这些问题用以下的格式写了下来:

牛4说:牛5比牛10吃得多

牛6说:牛10比牛7吃得多

牛3说:牛2比牛6吃得多

牛1说:牛7比牛5吃得多

从这个例子中不难看出说谎的奶牛只有可能是4,6,1.你的任务是确定可能说谎的奶牛的个

数.可能说谎的奶牛是指如果这头奶牛说谎则输入数据中不存在矛盾.

Input

第1行:两个用空格分开的整数N和Q.第2到Q+1:每一行描述一个问题,由3个用空格隔开的整数A,B,C表示,意思是A说B牛吃的比C牛多.一头奶牛可能回答多次.

Output

仅一行一个整数即可能说谎的奶牛的头数.

Sample Input

3 4
3 1 2
1 3 1
1 3 2
2 2 1

Sample Output

2

样例说明
3头奶牛给出了4个回答.奶牛1说3>1,3>2,奶牛2说2>1,奶牛3说1>2.当然“>”的意思是“吃得多”. 显然,2号和3号的话是矛盾的.它们都有可能说谎.如果1号说谎则2,3都没说谎,那是不可能的.所以,1号说的一定是实话.

HINT

Source

Orange

时间: 2024-11-08 23:12:55

BZOJ 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜( 差分约束 )的相关文章

bzoj 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜

3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜 Description 兽群中总是有一些麻烦制造者.约翰知道他的N(1≤N≤100)头奶牛中有一头总是说谎,其他的总是说真话.他想快速的找出这个麻烦制造者.为了实现这个目标,他一个一个的问这些奶牛Q(1≤Q≤1000)个关于它们吃草的简单问题(虽然大多数奶牛是诚实的但它们依旧很笨只能懂得一些关于食物的话题). 他将这些问题用以下的格式写了下来: 牛4说:牛5比牛10吃得多 牛6说:牛10比牛7吃得多 牛3说:牛

bzoj3374[Usaco2004 Mar]Special Serial Numbers 特殊编号*

bzoj3374[Usaco2004 Mar]Special Serial Numbers 特殊编号 题意: 求比一个数大的最小的一半以上的数位相同的数.数位数≤100. 题解: 模拟题.从低位枚举到高位,对于每一位枚举比原数该位大的数,同时枚举这一位之后要由0和哪一个数组成,最后得到一个最小的数输出.具体看代码. 有点像NOIP的那道Jam的计数法. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algor

bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛*

bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛 题意: 依次给出n只奶牛的产奶时间段,求最大的k使得前k只奶牛不存在一个时间段被另一个时间段完全覆盖的情况.n≤100000. 题解: 设当前在处理第i只奶牛,前i-1只奶牛都合法.那么如果前i-1只奶牛中时间段左端点小于且最接近第i只奶牛时间段左端点的奶牛右端点大于当前奶牛则不合法,且如果前i-1只奶牛中时间段左端点大于且最接近第i只奶牛时间段左端点的奶牛右端点小于第i只奶牛则不合法,这是一个贪心的过程,可以

DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 419  Solved: 278 Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k.那总的不河蟹度就是所有段的不河蟹度的总和

BZOJ 3357: [Usaco2004]等差数列

3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 338  Solved: 160[Submit][Status][Discuss] Description 约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7” 很容易看出“1,3,5,7”是等差数列. 给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Input 第1行:一个

BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )

dp dp( x , k ) = max( dp( x - 1 , k - 1 ) + *** , dp( x - 1 , k ) + *** ) *** = 0 or 1 ,根据情况 (BZOJ 1750双倍经验) ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm>

BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description 一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫 打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的

[BZOJ] 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛

1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1312  Solved: 736[Submit][Status][Discuss] Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T

[BZOJ] 1639: [Usaco2007 Mar]Monthly Expense 月度开支

1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 533[Submit][Status][Discuss] Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1