无标题

洛谷P1993小k的农场:https://www.luogu.org/problemnew/show/P1993

题目描述

小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”。

输入输出样例

输入样例#1:  复制
3 3
3 1 2
1 1 3 1
2 2 3 2
输出样例#1:  复制
Yes

说明

对于 100% 的数据保证:1 ≤ n,m,a,b,c ≤ 10000。

思路:

如果存在负环说明有问题。

 1 #include<bits/stdc++.h>
 2 #define R 10005
 3 using namespace std;
 4 int n,m,a,b,c,h[R],num,p,cnt[R],ans[R],vis[R];
 5 struct pp{
 6     int dis,to,nxt;
 7 }e[R*10];
 8 void add(int f,int to,int dis)
 9 {
10     e[++num].nxt=h[f];
11     e[num].to=to;
12     e[num].dis=dis;
13     h[f]=num;
14 }
15 int spfa()
16 {
17     priority_queue<int,vector<int>,greater<int> >q;
18     memset(ans,127,sizeof(ans));
19     memset(vis,0,sizeof(vis));
20     q.push(0);
21     vis[0]=1;
22     ans[0]=0;
23     while(!q.empty())
24     {
25         int w=q.top();
26         q.pop();
27         vis[w]=0;
28         for(int i=h[w];i;i=e[i].nxt)
29         {
30             int t=e[i].to;
31             if(ans[t]>ans[w]+e[i].dis)
32             {
33                 ans[t]=ans[w]+e[i].dis;
34                 cnt[t]=cnt[w]+1;
35                 if(cnt[t]>n)
36                 return 0;
37                 if(vis[t]==0)
38                 {
39                     q.push(t);
40                     vis[t]=1;
41                 }
42             }
43         }
44     }
45     return 1;
46 }
47 int main()
48 {
49     cin>>n>>m;
50     for(int i=1;i<=n;i++)
51     add(0,i,0);
52     for(int i=1;i<=m;i++)
53     {
54         cin>>p;
55         if(p==1)
56         {
57             cin>>a>>b>>c;
58             add(a,b,-c);
59         }
60         if(p==2)
61         {
62             cin>>a>>b>>c;
63             add(a,b,c);
64         }
65         if(p==3)
66         {
67             cin>>a>>b;
68             add(a,b,0);
69             add(b,a,0);
70         }
71     }
72     if(spfa())
73     cout<<"Yes";
74     else
75     cout<<"No";
76 }

  

猜你喜欢

转载自www.cnblogs.com/JRZZTD/p/9098411.html