码迷,mamicode.com
首页 > 其他好文 > 详细

P3275 [SCOI2011]糖果

时间:2019-07-03 14:01:31      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:get   iostream   不同的   tchar   targe   code   stack   lis   include   

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]糖果

标签:get   iostream   不同的   tchar   targe   code   stack   lis   include   

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11125700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!