1617: 刘备闯三国之汉中之战

Time Limit: 1000 MS  Memory Limit: 128 MB
Submit: 6  Solved: 5
[Submit][Status][Web Board]

Description

刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代。刘备一生极具传奇色彩,早年颠沛流离、备尝艰辛最终却凭借自己的谋略终成一方霸主。那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们一起拨开历史的迷雾,还原一个真实的刘备。

建安二十二年,刘备与曹操争夺汉中,展开了一场大战。

刘备的军队有n(1<=n<=200000)个营寨,营寨之间有m条道路相连(1<=m<=200000),刘备想在一些营寨上放置一些装备。由于装备有限且不同的道路重要程度不一样,有些道路连接的2个营寨都要放装备,有的道路只要在其连接的两个营寨之一放置装备即可,有的道路连接的两个营寨都不需要放置装备。

如何在满足条件下,放置最少的装备又是一个头疼的问题。当然,由于之前的出色发挥,现在已经晋升为大内总管的你,是时候证明你自己配得上这个职位了。

Input

第一行包含两个整数n,m。

接下来m行,每行有3个整数a,b,c.

a,b表示营寨a和b之间有一条道路(1<=a,b<=n);

c为0,或1或2。表示这条道路两边的营寨应该恰好选择c个放置装备。

Output

如果存在满足要求的方案,输出最少需要放置装备的数量。

否则输出impossible。

Sample Input

样例一:
4 4
1 2 2
2 3 1
3 4 1
4 1 2

样例二:
5 5
1 2 1
2 3 1
2 4 1
2 5 1
4 5 1

Sample Output

样例一:
3

样例二:
impossible

HINT

 

Source

[Submit][Status][Web Board]

题目链接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1617

题目大意:

  N个点,M条边,每条边都有一个要求军械库数量C(0 1 2),表示这条边的两个端点的军械库数量和为C,且每个端点最多放1个军械库。

  问是否能够满足军械库放置要求,能满足的话输出最小的军械库数量。

题目思路:

  【BFS+染色】

  因为每个点只能有或没有军械库。将军械库视为标记。首先由于是无向图所以存在若干联通块。

  可以枚举每个联通块的其中一个点有还是没有标记,并用这个点去拓展这个点的联通块并01染色(这个点所能到达的所有点)

  初始点标记为0需要的标记数为sum0,初始点为1的标记数为sum1,选取0 或1 能够满足的加到答案,如果0 1染色都能够满足图的要求就取min。

  在BFS的过程中只要有一个节点同时不满足0和1染色则无解。

  每个点只会被走过一次,所以是O(N)的。

 /****************************************************

     Author : Coolxxx
Copyright 2017 by Coolxxx. All rights reserved.
BLOG : http://blog.csdn.net/u010568270 ****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
const double EPS=1e-;
const int J=;
const int MOD=;
const int MAX=0x7f7f7f7f;
const double PI=3.14159265358979323;
const int N=;
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans;
int q[N],last[N];
int mark[N][];
bool u[N];
struct xxx
{
int next,to,d;
}a[N+N];
void add(int x,int y,int z)
{
a[++lll].to=y;
a[lll].d=z;
a[lll].next=last[x];
last[x]=lll;
}
bool spfa(int s)
{
int i,l=,r=,now,to,sumz=,sumo=;
bool z=,o=;
q[]=s;mark[s][]=,mark[s][]=;u[s]=;
while(l!=r)
{
now=q[l=(l+)%N];
sumz+=mark[now][];sumo+=mark[now][];
for(i=last[now];i;i=a[i].next)
{
to=a[i].to;
if(mark[to][]==-)mark[to][]=a[i].d-mark[now][];
if(mark[to][]==-)mark[to][]=a[i].d-mark[now][];
if(mark[now][]+mark[to][]!=a[i].d || mark[to][]< || mark[to][]>)z=;
if(mark[now][]+mark[to][]!=a[i].d || mark[to][]< || mark[to][]>)o=;
if(!u[to])
{
u[to]=;
q[r=(r+)%N]=to;
}
}
if(z && o)break;
}
if(z && o)return ;
if(!z && o)ans+=sumz;
else if(z && !o)ans+=sumo;
else if(!z && !o)ans+=min(sumz,sumo);
return ;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int x,y,z;
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(~scanf("%d",&n))
{
mem(u,);mem(mark,-);
scanf("%d",&m);
for(i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
ans=;
for(i=;i<=n;i++)
{
if(u[i])continue;
if(!spfa(i))break;
}
if(i<=n)puts("impossible");
else printf("%d\n",ans);
}
return ;
}
/*
// //
*/

XMU 1617 刘备闯三国之汉中之战 【BFS+染色】的更多相关文章

  1. XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】

    1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 45  Solved: 8[Submit][Status][W ...

  2. XMU 1614 刘备闯三国之三顾茅庐(二) 【逆向思维+二维并查集】

    1614: 刘备闯三国之三顾茅庐(二) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 15  Solved: 5[Submit][Status][W ...

  3. XMU 1613 刘备闯三国之三顾茅庐(一) 【并查集】

    1613: 刘备闯三国之三顾茅庐(一) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 99  Solved: 29[Submit][Status][ ...

  4. XMU 1612 刘备闯三国之桃园结义 【二分】

    1612: 刘备闯三国之桃园结义 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 181  Solved: 12[Submit][Status][We ...

  5. XMU 1611 刘备闯三国之卖草鞋 【贪心】

    1611: 刘备闯三国之卖草鞋 Time Limit: 1000 MS  Memory Limit: 64 MBSubmit: 90  Solved: 48[Submit][Status][Web B ...

  6. Characters_of_the_Three_Kingdoms - 三国人物结构化数据

    Characters_of_the_Three_Kingdoms - 三国人物结构化数据 三国人物结构化数据 为什么会有这个项目 需求1:摆脱网上那些长篇累牍的文章: 需求2:只是想简单查看下人物姓甚 ...

  7. 《BI那点儿事》Microsoft 决策树算法——找出三国武将特性分布,献给广大的三国爱好者们

    根据游戏<三国志11>武将数据,利用决策树分析,找出三国武将特性分布.其中变量包括统率.武力.智力.政治.魅力.身分.变量说明:统率:武将带兵出征时的部队防御力.统帅越高受到普通攻击与兵法 ...

  8. 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析

    献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 数据分析基础概念:集中趋势分析是指在大量测评数据分布中,测评数据向某点集中的情况.总体(population)是指客观存在 ...

  9. 《BI那点儿事》运用标准计分和离差——分析三国超一流统帅综合实力排名 绝对客观,数据说话

    数据分析基础概念:标准计分: 1.无论作为变量的满分为几分,其标准计分的平均数势必为0,而其标准差势必为1.2.无论作为变量的单位是什么,其标准计分的平均数势必为0,而其标准差势必为1.公式为: 离差 ...

随机推荐

  1. 洛谷 1067 NOIP2009 普及组 多项式输出

    [题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...

  2. ASP.NET MVC中如何在客户端进行必要的判断

    背景:在开发网站时,往往需要对用户的输入进行合法性检查,如果验证工作都放在服务器端,势必将影响网页的响应速度,同时给用户不好的体验.本篇随笔即是使用JQuery在客户端进行必要的合法检测. JS代码如 ...

  3. xtu summer individual 2 C - Hometask

    Hometask Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Origin ...

  4. [CTSC2007]数据备份Backup 题解

    题意: 一维直线上有n个点,任取2k个互不相同的点组成k条链,求链的最小总长 思路: 1.最优时链不相交,相邻两两相减,将题目转化为:在n-1个数中取互不相邻的k个数使总和最小. 2.贪心取最小的“数 ...

  5. bzoj 2337 高斯消元+概率DP

    题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...

  6. 字符串匹配(codevs 1404)

    题目描述 Description 给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度.给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个.N,M,K<=20000 ...

  7. Codeforces936B. Sleepy Game

    还好这场没打 MD什么破题 n<=100000,m<=200000的图问从s点出发能否走奇数条边到一个没有出度的点. 直观的想法:做一个bfs,$f(i,0/1)$表示从$s$出发到$i$ ...

  8. msp430入门编程34

    msp430中C语言的可移植--消除硬件差异

  9. HDU 4193 Non-negative Partial Sums【单调队列】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意: 给定序列,可以把后面的连续的部分移到最前面来,问多少种移法使得最终得到的序列的前i项和 ...

  10. webstorm 添加markdown支持

    第一步:file---setting---plugins---搜索markdown support 安装 第二步:file---settind---file types---增加*.md处理