uestc 1511 糖果 差分约束

2013.10.23 更新

    普通spfa

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define INF 1E9
using namespace std;
int First[100005],Next[200005],W[200005],U[200005];
int cnt;
int N;
void add(int v,int u,int w)
{
    Next[cnt]=First[v];
    First[v]=cnt;
    W[cnt]=w;
    U[cnt]=u;
    cnt++;
}
int in[100005];
long long Dis[100005];
bool inq[100005];
queue<int> q;
bool spfa()
{
    int now,i,u;
    long long t;
    while(!q.empty())
    {
        now=q.front();q.pop();
        inq[now]=0;
        if(in[now]>N)return 1;
        for(i=First[now];~i;i=Next[i])
        {
            u=U[i];
            if(Dis[u]<(t=Dis[now]+W[i]))
            {
                Dis[u]=t;
                if(++in[u]>N)return 1;
                if(inq[u])continue;
                inq[u]=1;
                q.push(u);
            }
        }
    }
    return 0;
}
 inline void inp( int &n )//fast input function
{
	n=0;
	int ch=getchar_unlocked(),sign=1;
	while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=getchar_unlocked();}
	while( ch >= '0' && ch <= '9' )
 		n=(n<<3)+(n<<1)+ ch-'0', ch=getchar_unlocked();
	n=n*sign;
}

int main()
{
    int K,i,t,A,B;
    scanf("%d%d",&N,&K);
    cnt=0;
    for(i=1;i<=N;i++)
    {
        First[i]=-1;
        Dis[i]=in[i]=inq[i]=1;
        q.push(i);
    }
    for(i=0;i<K;i++)
    {
        inp(t);
        inp(A);
        inp(B);
        switch(t)
        {
            case 1:add(A,B,0);add(B,A,0);break;
            case 2:add(A,B,1);
                if(A==B)
                {
                    puts("-1");
                    return 0;
                }break;
            case 3:add(B,A,0);break;
            case 4:add(B,A,1);
                if(A==B)
                {
                    puts("-1");
                    return 0;
                }break;
            case 5:add(A,B,0);break;
        }
    }
    if(spfa())printf("%d\n",-1);
    else
    {
        long long ans=0;
        for(i=1;i<=N;i++)
        {
            ans+=Dis[i];
            //  cout<<Dis[i]<<endl;
        }
    //cout<<Min<<endl;
        printf("%lld\n",ans);
    }
}
时间: 2024-08-01 17:52:26

uestc 1511 糖果 差分约束的相关文章

poj 1201/ZOJ 1508 Intervals 差分约束

   典型差分约束,注意一点是可以不把与前后相连的固定边加到图中,直接spfa时判断即可,这样可以节省很多时间空间    差分约束的关键就在于要写清楚不等式 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include

差分约束转最短路径概述

差分约束系统   整理自:http://ycool.com/post/m2uybbf.   如果一个系统由n个变量和m个约束条件组成,其中每个约束条件都形如xj-xi<=bk,(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints).亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法.   求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题.   比如有这样一组不等式,不等式组(1): X1 - X2 <

poj 1201 Intervals 差分约束+spfa

     利用相互关系进行约束,求最长路      /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <

ACM各种算法

2012-03-24 20:23 248人阅读 评论(0) 收藏 举报 优秀博客推荐:各种数据结构与算法知识入门经典(不断更新) 欢迎自荐和推荐链接.请于留言处告知. 基本算法 贪心算法:贪心算法 作者:独酌逸醉                贪心算法精讲 作者:3522021224递归和分治:递归与分治策略 作者:zhoudaxia 图论 图的遍历(DFS和BFS):  图的遍历 作者:jefferent 最小生成树(Prim算法和Kruskal算法): 贪心算法--最小生成树 作者:独酌逸醉

糖果浏览器怎么导入其它浏览器的收藏夹

  糖果浏览器"收藏"菜单--导入导出及恢复收藏夹--导入收藏夹 在导入收藏夹对话框中,根据收藏夹文件类型选择导入.

启用约束时使用exceptions表来跟踪不符合约束的数据并修正

启用约束时使用exceptions表来跟踪不符合约束的数据并修正 使用 EXCEPTIONS 表 1. 创建 EXCEPTIONS 表 (utlexcpt.sql) 2. 使用 EXCEPTIONS 子句执行 ALTER TABLE 3. 使用 EXCEPTIONS 子查询查找包含无效数据的行 4. 纠正错误 5. 再次执行 ALTER TABLE 以启用约束 如何识别行违反 EXCEPTIONS 子句帮助识别任何违反已启用的约束的行按下列步骤检测违反 约束的行为纠正它们并重新启用约束 1 如果

OpenCv图像差分(算法自己实现)

效果杠杠的!! //图像差分 #include <stdio.h> #include <stdlib.h> #include "cv.h" #include "highgui.h" void Image_Minus(IplImage *X, IplImage *Y, IplImage *X_Y) { //图像差分函数,将图像1中像素和图像2中对应像素想减,要求X.Y.X_Y大小相同 int i,j,width,height,step,chan

用画笔描边路径及图层样式制作彩色糖果字

  制作文字之前,需要自己定义一些糖果图形笔刷,然后在文字边缘用描边路径加上糖果图形,再用图层样式加上颜色和质感,文字中间则用画笔涂上图形后再用图层样式增加质感. 最终效果 1.创建一个500*500的画布. 2.用椭圆工具创建一个圆,大小自己定,随意. 3.用直接选择工具框选中中间的锚点. 4.用方向键的左箭头键进行移动. 5.用直接选择工具移动锚点的方向线,耐心的调整形状. 6.调整好大概的形状,如果你不能确定什么形状,你可以上网搜各种豆类的形状来模仿! 调整后,在菜单栏,编辑--定义画笔预

Photoshop制作逼真的巧克力糖果立体字

  Photoshop制作逼真的巧克力糖果立体字          最终效果   1.创建一个新的画布,在300dpi分辨率高14.85厘米宽x10.5厘米.设置颜色模式为RGB,背景内容为白色. 2.选择文字工具(T),输入第一个字母,字体为:Pyno Slab Demo,可以去网上下载,大小为160PT,颜色颜色为:#5d1e0f. 3.选择3D>从所选的层挤出. 如果你还没有得到的三维工作空间活跃,会出现以下提示. 4.如果您使用过的CS5的3D凸纹工具,在CS6的3D体验已完全翻修和更直