標籤:
3436: 小K的農場Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 443 Solved: 220
[Submit][Status][Discuss]Description
背景
小K是個特麼喜歡玩MC的孩紙。。。
描述
小K在MC裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m個),以下列三種形式描述:農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場a與農場b種植的作物數一樣多。但是,由於小K的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式
Input
第一行包括兩個整數n和m,分別表示農場數目和小K記憶中的資訊的數目
接下來m行:
如果每行的第一個數是1,接下來有三個整數a,b,c,表示農場a比農場b至少多種植了c個單位的作物 如果每行第一個數是2,接下來有三個整數a,b,c,表示農場a比農場b至多多種植了c個單位的作物
如果每行第一個數是3,接下來有兩個整數a,b,表示農場a種植的數量與b一樣多輸出格式
Output
如果存在某種情況與小K的記憶吻合,輸出”Yes”,否則輸出”No”
Sample Input 33
312
1131
2232
Sample Output
Yes
範例解釋
三個農場種植的數量可以為(2,2,1)。 題解:就愛搜刮q神的姿勢,這題是差分約束
/************************************************************** Problem: 3436 User: 1085422276 Language: C++ Result: Wrong_Answer****************************************************************/ #include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<queue>#include<cmath>#include<map>using namespace std ;typedef long long ll;#define inf 100000#define maxn 10000+5inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f;}//******************************************************************struct ss{int to,v;};vector<ss >G[maxn];int flag=0,vis[maxn],dis[maxn];int n,m;void dfs(int x){ vis[x]=1; for(int i=0;i<G[x].size();i++) { if(dis[G[x][i].to]>dis[x]+G[x][i].v) { if(vis[G[x][i].to]) { flag=1; return ; } dis[G[x][i].to]=dis[x]+G[x][i].v; dfs(G[x][i].to); // vis[G[x][i].to]=1; } } vis[x]=0;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { int t=read(); int a,b,c; if(t==3) { scanf("%d%d",&a,&b); G[a].push_back((ss){b,0}); }else if(t==1){ scanf("%d%d%d",&a,&b,&c); G[a].push_back((ss){b,-c}); } else { scanf("%d%d%d",&a,&b,&c); G[b].push_back((ss){a,c}); } } flag=0; memset(dis,127,sizeof(dis)); for(int i=1;i<=n;i++){ dis[i]=0; dfs(i); if(flag){ cout<<"No"<<endl;return 0; } } cout<<"Yes"<<endl; return 0;}代碼
BZOJ 3436: 小K的農場 差分約束