zoukankan      html  css  js  c++  java
  • 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
    ");
     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
    ");
     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
    ");
     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
    ",ans);//输出,结束
    101     return 0;
    102 }

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

  • 相关阅读:
    推荐文章:深入浅出REST
    推荐Fowler作序的新书《xUnit Test Patterns》
    测试替身:Test Double
    踢毽也能治胃病,适当的运动带来健康,健康带来快乐
    10分钟入门AOP:用PostSharp普及一下AOP
    推荐一本新的英文版算法书和一本讲debug的书
    emacs开发rails的演示
    转:一个土木工程师在四川地震灾后的思考
    多语言多范型编程PPP
    巧用editplus学习正则表达式
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11125700.html
Copyright © 2011-2022 走看看