背景
小K是个特么喜欢玩MC的孩纸。。。
描述
小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得
一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多
多种植了c个单位的作物,农场a与农场b种植的作物数一样多。但是,由于小K的记忆有些偏差,所以他想要知道存
不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。
标签:
如果存在某种情况与小K的记忆吻合,输出”Yes”,否则输出”No”
#include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <algorithm> using namespace std; const int maxn = 100010; struct node { int to, w; }; vector<node> e[maxn]; int vis[maxn],n,m,d[maxn]; bool flag; void add(int u, int v, int w) { node temp; temp.to = v; temp.w = w; e[u].push_back(temp); } void spfa(int x) { vis[x] = 1; for (int i = 0; i < e[x].size(); i++) { node v = e[x][i]; if (d[v.to] > d[x] + v.w) { if (vis[v.to]) //存在更短的路径又被访问过,说明存在负环 { flag = true; return; } d[v.to] = d[x] + v.w; spfa(v.to); } } vis[x] = false; return; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int x,a,b,c; scanf("%d", &x); if (x == 1) { scanf("%d%d%d", &a, &b, &c); add(a, b, 0 - c); } if (x == 2) { scanf("%d%d%d", &a, &b, &c); add(b, a, c); } if (x == 3) { scanf("%d%d", &a, &b); add(a, b, 0); add(b, a, 0); } } flag = false; for (int i = 1; i <= n; i++) { d[i] = 0; spfa(i); if (flag) break; } if (flag) printf("No"); else printf("Yes"); return 0; }
标签:
原文地址:http://www.cnblogs.com/zbtrs/p/5811358.html