XMU 1617 刘备闯三国之汉中之战 【BFS+染色】
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 1Sample Output
样例一:
3样例二:
impossibleHINT
Source
by cjf
[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)的。
1 /**************************************************** 2 3 Author : Coolxxx 4 Copyright 2017 by Coolxxx. All rights reserved. 5 BLOG : http://blog.csdn.net/u010568270 6 7 ****************************************************/ 8 #include<bits/stdc++.h> 9 #pragma comment(linker,"/STACK:1024000000,1024000000") 10 #define abs(a) ((a)>0?(a):(-(a))) 11 #define lowbit(a) (a&(-a)) 12 #define sqr(a) ((a)*(a)) 13 #define mem(a,b) memset(a,b,sizeof(a)) 14 const double EPS=1e-8; 15 const int J=10; 16 const int MOD=100000007; 17 const int MAX=0x7f7f7f7f; 18 const double PI=3.14159265358979323; 19 const int N=200004; 20 using namespace std; 21 typedef long long LL; 22 double anss; 23 LL aans; 24 int cas,cass; 25 int n,m,lll,ans; 26 int q[N],last[N]; 27 int mark[N][2]; 28 bool u[N]; 29 struct xxx 30 { 31 int next,to,d; 32 }a[N+N]; 33 void add(int x,int y,int z) 34 { 35 a[++lll].to=y; 36 a[lll].d=z; 37 a[lll].next=last[x]; 38 last[x]=lll; 39 } 40 bool spfa(int s) 41 { 42 int i,l=0,r=1,now,to,sumz=0,sumo=0; 43 bool z=0,o=0; 44 q[1]=s;mark[s][0]=0,mark[s][1]=1;u[s]=1; 45 while(l!=r) 46 { 47 now=q[l=(l+1)%N]; 48 sumz+=mark[now][0];sumo+=mark[now][1]; 49 for(i=last[now];i;i=a[i].next) 50 { 51 to=a[i].to; 52 if(mark[to][0]==-1)mark[to][0]=a[i].d-mark[now][0]; 53 if(mark[to][1]==-1)mark[to][1]=a[i].d-mark[now][1]; 54 if(mark[now][0]+mark[to][0]!=a[i].d || mark[to][0]<0 || mark[to][0]>1)z=1; 55 if(mark[now][1]+mark[to][1]!=a[i].d || mark[to][1]<0 || mark[to][1]>1)o=1; 56 if(!u[to]) 57 { 58 u[to]=1; 59 q[r=(r+1)%N]=to; 60 } 61 } 62 if(z && o)break; 63 } 64 if(z && o)return 0; 65 if(!z && o)ans+=sumz; 66 else if(z && !o)ans+=sumo; 67 else if(!z && !o)ans+=min(sumz,sumo); 68 return 1; 69 } 70 int main() 71 { 72 #ifndef ONLINE_JUDGE 73 freopen("1.txt","r",stdin); 74 // freopen("2.txt","w",stdout); 75 #endif 76 int i,j,k; 77 int x,y,z; 78 // for(scanf("%d",&cass);cass;cass--) 79 // for(scanf("%d",&cas),cass=1;cass<=cas;cass++) 80 // while(~scanf("%s",s)) 81 while(~scanf("%d",&n)) 82 { 83 mem(u,0);mem(mark,-1); 84 scanf("%d",&m); 85 for(i=1;i<=m;i++) 86 { 87 scanf("%d%d%d",&x,&y,&z); 88 add(x,y,z); 89 add(y,x,z); 90 } 91 ans=0; 92 for(i=1;i<=n;i++) 93 { 94 if(u[i])continue; 95 if(!spfa(i))break; 96 } 97 if(i<=n)puts("impossible"); 98 else printf("%d\n",ans); 99 } 100 return 0; 101 } 102 /* 103 // 104 105 // 106 */
View Code
转载于:https://www.cnblogs.com/Coolxxx/p/6754530.html
XMU 1617 刘备闯三国之汉中之战 【BFS+染色】相关推荐
- XMU 1611 刘备闯三国之卖草鞋 【贪心】
1611: 刘备闯三国之卖草鞋 Time Limit: 1000 MS Memory Limit: 64 MB Submit: 89 Solved: 47 [Submit][Status][Web ...
- Java简易版的对战小游戏(主题是三国类游戏对战)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 提示:今天写一个简易版的Java对战小游戏(主题是三国类游戏对战): 需要先写一个Person类(代表人),然后写一个 ...
- 三国论(11-15章)
作者:林木村 第11章 官渡争雄 此时在中原,经过一番激烈的兼并,曹操和袁绍是剩下的两大武装集团.两军好比是一次锦标赛中排名一二的种子选手,斩将过关后在半决赛狭路相逢,将上演一场提前的决赛.获胜的一方 ...
- 商业智慧——三国职场人
<商业智慧:三国职场人生> 三国职场人生 找对你的老板 曹操VS袁绍,跟对老板(1) 三国典故:张绣认曹操做老大 张绣公司是个小公司,数次击败曹操,在宛城占了一点地盘.张绣知道,小公司生存 ...
- 被诸葛亮的光环掩盖起来的三国英雄
在<三国演义>中,诸葛亮的形象无疑是一尊神,所有和他对过累的将领无一不是被打败了,就算是没有打败,也是要来掩饰一番.(不包括三国以外的其他书籍记载)可能不细心的人还没知道<三国演义& ...
- 三国人物论—44—吕蒙
谲计当惊世界殊 --论吕蒙 人物简介:吕蒙字子明,汝南富陂(今河南省新蔡县)人,少年时代即果敢有胆,孙策辞世后,他追随孙权,在攻占江夏擒斩黄祖.随从周瑜大战曹仁.拒曹操于濡须.夺皖城于一役.巧取长沙零 ...
- 第二十一章 刘备脱险
第二十一章 刘备脱险 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /& ...
- 和刘备相关的人(九 )
[color=indigo]<三国志•蜀书•诸葛亮传>记载了诸葛亮于刘备在"建安十六年"称帝之时,劝刘备不可违拗部下的攀龙附凤的愿望.诸葛亮引用了当年耿纯劝刘秀称帝的一 ...
- 和刘备相关的人(二)
[color=indigo]他无论到了哪里,关羽与张飞总跟着他,或是虽则暂时分开了,而迟早总会不避千辛万苦,跑来和他相聚.不仅关羽.张飞如此,赵云.糜竺.徐庶.诸葛亮也是如此.其后,庞统.黄忠.张松. ...
最新文章
- 赠书 | 一文了解预训练语言模型
- retinaface验证
- WINCE设备开机灰屏问题(很怪异)
- pwn学习总结(四)—— 堆基础知识(持续更新)
- 吴恩达 coursera AI 第三课总结+作业答案
- linux执行jar包命令没有主清单熟悉,jar命令成功完成 java -jar 命令却提示“没有主清单属性”!...
- 深入理解STM32内存管理
- oracle分区索引及循环插入
- REST风格笔记【简介篇】
- MYSQL5.6创建表报错 [ERR] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘
- win10环境下MinGW和MSYS的安装与配置
- 以太坊概念知识入门篇
- redis 数据结构笔记
- 真正解决办法:FTP 执行命令时500 Illegal PORT command
- 5S管理活动的实施和运行方案
- ts中简单的用法和存储器 get set 的用法
- Kaggle账号注册
- Mac安装Jadx反编译工具
- 任意模数ntt_MTT:任意模数NTT
- 北京市基本医疗保险A类定点医疗机构名单(2010-09-29)