小K的农场 差分约束
题目描述
小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:
- 农场a比农场b至少多种植了c个单位的作物,
- 农场a比农场b至多多种植了c个单位的作物,
- 农场a与农场b种植的作物数一样多。
但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。
输入输出格式
输入格式:第一行包括两个整数 n 和 m,分别表示农场数目和小 K 记忆中的信息数目。
接下来 m 行:
如果每行的第一个数是 1,接下来有 3 个整数 a,b,c,表示农场 a 比农场 b 至少多种植了 c 个单位的作物。
如果每行的第一个数是 2,接下来有 3 个整数 a,b,c,表示农场 a 比农场 b 至多多种植了 c 个单位的作物。如果每行的第一个数是 3,接下来有 2 个整数 a,b,表示农场 a 种植的的数量和 b 一样多。
输出格式:如果存在某种情况与小 K 的记忆吻合,输出“Yes”,否则输出“No”。
输入输出样例
说明
对于 100% 的数据保证:1 ≤ n,m,a,b,c ≤ 10000。
唯一要注意的是:广搜的 spfa会T,换成 dfs 的 spfa 即可;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #include<bitset> #include<ctime> #include<deque> #include<stack> #include<functional> #include<sstream> //#include<cctype> //#pragma GCC optimize(2) using namespace std; #define maxn 200005 #define inf 0x7fffffff //#define INF 1e18 #define rdint(x) scanf("%d",&x) #define rdllt(x) scanf("%lld",&x) #define rdult(x) scanf("%lu",&x) #define rdlf(x) scanf("%lf",&x) #define rdstr(x) scanf("%s",x) typedef long long ll; typedef unsigned long long ull; typedef unsigned int U; #define ms(x) memset((x),0,sizeof(x)) const long long int mod = 1e9 + 7; #define Mod 1000000000 #define sq(x) (x)*(x) #define eps 1e-3 typedef pair< int , int > pii; #define pi acos(-1.0) //const int N = 1005; #define REP(i,n) for(int i=0;i<(n);i++) typedef pair< int , int > pii; inline ll rd() { ll x = 0; char c = getchar (); bool f = false ; while (! isdigit (c)) { if (c == '-' ) f = true ; c = getchar (); } while ( isdigit (c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar (); } return f ? -x : x; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); } int sqr( int x) { return x * x; } /*ll ans; ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans; } */ int n, m; struct node { int u, v, w; int nxt; }edge[maxn]; int head[maxn]; int tot; bool vis[maxn]; int dis[maxn]; int num[maxn]; void addedge( int u, int v, int w) { edge[++tot].u = u; edge[tot].v = v; edge[tot].w = w; edge[tot].nxt = head[u]; head[u] = tot; } bool spfa( int k) { vis[k] = 1; for ( int i = head[k]; i; i = edge[i].nxt) { int v = edge[i].v; if (dis[v] < dis[k] + edge[i].w) { dis[v] = dis[k] + edge[i].w; if (vis[v]) return false ; if (!spfa(v)) return false ; } } vis[k] = 0; return true ; } int main() { //ios::sync_with_stdio(0); cin >> n >> m; for ( int i = 1; i <= m; i++) { int op; rdint(op); if (op == 1) { int a, b, c; rdint(a); rdint(b); rdint(c); addedge(b, a, c); } else if (op == 2) { int a, b, c; rdint(a); rdint(b); rdint(c); addedge(a, b, -c); } else { int a, b; rdint(a); rdint(b); addedge(a, b, 0); addedge(b, a, 0); } } for ( int i = 1; i <= n; i++)addedge(0, i, 0), dis[i] = -inf; if (spfa(0))cout << "Yes" << endl; else cout << "No" << endl; return 0; } |
EPFL - Fighting
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步