P3275 [SCOI2011]糖果

Posted hahaha2124652975

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3275 [SCOI2011]糖果相关的知识,希望对你有一定的参考价值。

emmmm博客补不完喽~~~(其实这是题目链接,但。。也确实是事实。。)

这题呢,也基本上就是差分约束的模板题了(要是不知道差分约束的话自行百度一下喽~~),实际上这类题目吧,撇开读入,基本都一样,就是跑几遍最短路,但是不得不说这个差分约束的读入真的是多种多样,就没见过两题的读入能一样的。。

反正就是对于不同的数据进行建图,具体的还是看代码吧嘤嘤嘤~~

  1 #include<set>
  2 #include<map>
  3 #include<list>
  4 #include<queue>
  5 #include<stack>
  6 #include<string>
  7 #include<cmath>
  8 #include<ctime>
  9 #include<vector>
 10 #include<bitset>
 11 #include<memory>
 12 #include<utility>
 13 #include<cstdio>
 14 #include<sstream>
 15 #include<iostream>
 16 #include<cstdlib>
 17 #include<cstring>
 18 #include<algorithm>
 19 using namespace std;
 20 
 21 int n,k,tot;
 22 long long ans;
 23 int head[300005],next[300005],to[300005],w[300005],dis[300005],used[300005];
 24 bool vis[300005];
 25 queue<int>q;//堆优化
 26 
 27 inline int get()//快读
 28     char c=getchar();
 29     int res=0;
 30     while (c<0||c>9) c=getchar();
 31     while (c>=0&&c<=9)
 32         res=(res<<3)+(res<<1)+c-0;
 33         c=getchar();
 34     
 35     return res;
 36 
 37 
 38 void add(int u,int v,int c)//链式前向星
 39     to[++tot]=v;
 40     next[tot]=head[u];
 41     head[u]=tot;
 42     w[tot]=c;
 43 
 44 
 45 int main()
 46     n=get();
 47     k=get();
 48     while(k--)
 49         int u,v,c;
 50         c=get(),u=get(),v=get();//读入,并在下面对不同的数据进行分组处理
 51         if(c==1)
 52             add(u,v,0);
 53             add(v,u,0);
 54         
 55         else if(c==2)
 56             if(u==v)
 57                 printf("-1\n");
 58                 return 0;
 59             
 60             add(u,v,1);
 61         
 62         else if(c==3)
 63             add(v,u,0);
 64         
 65         else if(c==4)
 66             if(v==u)
 67                 printf("-1\n");
 68                 return 0;
 69             
 70             add(v,u,1);
 71         
 72         else if(c==5)add(u,v,0);
 73     
 74     for(int i=n;i>=1;i--)
 75         add(0,i,1);//处理非连通图的情况
 76     
 77     vis[0]=1,q.push(0);//直接跑spfa
 78     while(!q.empty())
 79         int u=q.front();
 80         q.pop();
 81         vis[u]=0;
 82         if(used[u]==n-1)
 83             printf("-1\n");
 84             return 0;
 85         
 86         used[u]++;
 87         for(int i=head[u];i;i=next[i])
 88             if(dis[to[i]]<dis[u]+w[i])
 89                 dis[to[i]]=dis[u]+w[i];
 90                 if(!vis[to[i]])
 91                     vis[to[i]]=1;
 92                     q.push(to[i]);
 93                 
 94             
 95         
 96     
 97     for(int i=1;i<=n;i++)
 98         ans+=dis[i];
 99     
100     printf("%lld\n",ans);//输出,结束
101     return 0;
102 

好的就这样了我还要睡觉,白白。。。

以上是关于P3275 [SCOI2011]糖果的主要内容,如果未能解决你的问题,请参考以下文章

P3275 [SCOI2011]糖果

P3275 [SCOI2011]糖果

洛谷P3275 [SCOI2011]糖果

P3275 [SCOI2011]糖果

Luogu P3275 [SCOI2011]糖果

题解Luogu P3275 [SCOI2011] 糖果 差分约束