zoukankan      html  css  js  c++  java
  • bzoj3436

    普通的查分约束 用dfs判负环(注意要对每个点都进行dfs,因为图可能是几部分)

     1 #include<bits/stdc++.h>
     2 #define lowbit(a) ((a)&(-(a)))
     3 #define clr(a,x) memset(a,x,sizeof(a))
     4 #define rep(i,l,r) for(int i=l;i<(r);i++)
     5 typedef long long ll;
     6 using namespace std;
     7 int read()
     8 {
     9     char c=getchar();
    10     int ans=0,f=1;
    11     while(!isdigit(c)){
    12         if(c=='-') f=-1;
    13         c=getchar();
    14     }
    15     while(isdigit(c)){
    16         ans=ans*10+c-'0';
    17         c=getchar();
    18     }
    19     return ans*f;
    20 }
    21 struct edge{
    22     int v,w;
    23 };
    24 const int maxn=100009,inf=0x3fffffff;
    25 int n,m,d[maxn];
    26 bool p[maxn],flag=0;
    27 vector<edge>e[maxn];
    28 void addedge(int u,int v,int w){
    29     edge ed;
    30     ed.v=v,ed.w=w;
    31     e[u].push_back(ed);
    32 }
    33 void dfs(int k){
    34     if(p[k]){
    35         flag=1;
    36         return;
    37     };
    38     p[k]=1;
    39     rep(i,0,e[k].size()){
    40         int v=e[k][i].v,w=e[k][i].w;
    41         if(d[k]+w<d[v]){
    42             d[v]=d[k]+w;
    43             dfs(v);
    44             if(flag) return;
    45         }
    46     }
    47     p[k]=0;
    48 }
    49 int main()
    50 {    
    51     n=read(),m=read();
    52     while(m--){
    53         int opt=read(),a=read(),b=read();
    54         if(opt==1){
    55             int c=read();
    56             addedge(a,b,-c);
    57         }else if(opt==2){
    58             int c=read();
    59             addedge(b,a,c);
    60         }else{
    61             addedge(b,a,0);
    62             addedge(a,b,0);
    63         }
    64     }
    65     clr(p,0);
    66     rep(i,2,n+1) d[i]=inf;
    67     d[1]=0;
    68     rep(i,1,n+1) dfs(i);
    69     puts(flag?"No":"Yes");
    70     return 0;
    71 }
    View Code

    3436: 小K的农场

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 398  Solved: 205
    [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)。


    对于100%的数据,1<=n,m,a,b,c<=10000


    HINT

     

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    activiti笔记三 Activiti问题重现
    [转]电子商务文件存储及读取服务的设计和开发思路
    powerdesigner设置mysql唯一键,非主键
    git使用笔记
    activiti笔记二:用户任务
    解决方案:elipse一直loading descriptor for...
    activiti笔记一:流程图xml文件
    RabbitMq汇总
    docker汇总
    Zookeeper
  • 原文地址:https://www.cnblogs.com/chensiang/p/4742860.html
Copyright © 2011-2022 走看看