Breaking Good
Time limit2000 ms
Memory limit262144 kB
Breaking Good is a new video game which a lot of gamers want to have. There is a certain level in the game that is really difficult even for experienced gamers.
Walter William, the main character of the game, wants to join a gang called Los Hermanos (The Brothers). The gang controls the whole country which consists of ncities with m bidirectional roads connecting them. There is no road is connecting a city to itself and for any two cities there is at most one road between them. The country is connected, in the other words, it is possible to reach any city from any other city using the given roads.
The roads aren't all working. There are some roads which need some more work to be performed to be completely functioning.
The gang is going to rob a bank! The bank is located in city 1. As usual, the hardest part is to escape to their headquarters where the police can't get them. The gang's headquarters is in city n. To gain the gang's trust, Walter is in charge of this operation, so he came up with a smart plan.
First of all the path which they are going to use on their way back from city 1 to their headquarters n must be as short as possible, since it is important to finish operation as fast as possible.
Then, gang has to blow up all other roads in country that don't lay on this path, in order to prevent any police reinforcements. In case of non-working road, they don't have to blow up it as it is already malfunctional.
If the chosen path has some roads that doesn't work they'll have to repair those roads before the operation.
Walter discovered that there was a lot of paths that satisfied the condition of being shortest possible so he decided to choose among them a path that minimizes the total number of affected roads (both roads that have to be blown up and roads to be repaired).
Can you help Walter complete his task and gain the gang's trust?
Input
The first line of input contains two integers n, m (2 ≤ n ≤ 105, ), the number of cities and number of roads respectively.
In following m lines there are descriptions of roads. Each description consists of three integers x, y, z (1 ≤ x, y ≤ n, ) meaning that there is a road connecting cities number x and y. If z = 1, this road is working, otherwise it is not.
Output
In the first line output one integer k, the minimum possible number of roads affected by gang.
In the following k lines output three integers describing roads that should be affected. Each line should contain three integers x, y, z (1 ≤ x, y ≤ n, ), cities connected by a road and the new state of a road. z = 1 indicates that the road between cities x and y should be repaired and z = 0 means that road should be blown up.
You may output roads in any order. Each affected road should appear exactly once. You may output cities connected by a single road in any order. If you output a road, it's original state should be different from z.
After performing all operations accroding to your plan, there should remain working only roads lying on some certain shortest past between city 1 and n.
If there are multiple optimal answers output any.
Examples
2 1
1 2 0
1
1 2 1
4 4
1 2 1
1 3 0
2 3 1
3 4 1
3
1 2 0
1 3 1
2 3 0
8 9
1 2 0
8 3 0
2 3 1
1 4 1
8 7 0
1 5 1
4 6 1
5 7 0
6 8 0
3
2 3 0
1 5 0
6 8 1
Note
In the first test the only path is 1 - 2
In the second test the only shortest path is 1 - 3 - 4
In the third test there are multiple shortest paths but the optimal is 1 - 4 - 6 - 8
题目意思:就是给你一个n个点和m条边,每条边有编号z=1边是好的,z=0边是坏的,问从点1出发到点n的最短路,当最短路有多条时取修正值小的结果。修正的值=多余的好路(边)+要用的坏路(边),输入输出有格式。
分析:最短路+记录前驱
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=;
int n,m,sum;
int book[maxn];
struct node
{
int c;
int v;
};
struct edge
{
int a,b,c;
}e[maxn];
vector<node>v[maxn];
queue<int>q;
int n0[maxn];
int n1[maxn];
int t[maxn];
int pra[maxn];
int main()
{
scanf("%d %d",&n,&m);
sum=;
for(int i=;i<=n;i++)
{
pra[i]=i;
n0[i]=;
n1[i]=;
book[i]=;
}
memset(t,inf,sizeof(t));
for(int i=;i<=m;i++)
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
if(c==) sum++;//记录1的个数
e[i].a=x;
e[i].b=y;
e[i].c=c;
node a;
a.v=y;
a.c=c;
v[x].push_back(a);
a.v=x;
a.c=c;
v[y].push_back(a);
}
while(!q.empty()) q.pop();
q.push();
t[]=;
n0[]=;//这条路上有几个0
n1[]=;//有几个1
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=;i<v[x].size();i++)
{
node a=v[x][i];
int y=a.v;
if(t[y]>t[x]+)//用来记录路径的长短
{//选路径短的
t[y]=t[x]+;
if(a.c==) n0[y]=n0[x]+;
else n0[y]=n0[x];
if(a.c==) n1[y]=n1[x]+;
else n1[y]=n1[x];
pra[y]=x;//记录路径,不能写成pra【x】=y
q.push(y);
}
else if(t[y]==t[x]+)
{//如果路径相同
if(n0[y]>n0[x])
{//选0的个数少的,因为0少,修的路少,路径相同的情况下,0少1就多
if(a.c==) n0[y]=n0[x]+;
else n0[y]=n0[x];
if(a.c==) n1[y]=n1[x]+;
else n1[y]=n1[x];
pra[y]=x;
}
q.push(y);
}
} }
//cout<<n0[n]<<" "<<n1[n]<<endl;
//cout<<sum<<endl;
printf("%d",n0[n]+sum-n1[n]);//输出的是0的个数,总共1的个数-当前路的1的个数
int k=n;
//cout<<pra[1]<<" "<<pra[4]<<" "<<pra[6]<<endl;
while(pra[k]!=k)//整理一下
{
book[k]=;
k=pra[k];
}
for(int i=;i<=n;i++)
{
if(!book[i])
{
pra[i]=i;//该恢复的恢复
}
}
for(int i=;i<=m;i++)
{
edge x=e[i];
if(pra[x.a]!=x.b&&pra[x.b]!=x.a&&x.c==)
{
printf("\n");
printf("%d %d %d",x.a,x.b,); }
else if(pra[x.a]==x.b||pra[x.b]==x.a)
{
if(x.c==)
{
printf("\n");
printf("%d %d %d",x.a,x.b,);
}
}
}
return ;
}
Breaking Good的更多相关文章
- How can I protect derived classes from breaking when I change the internal parts of the base class?
		How can I protect derived classes from breaking when I change the internal parts of the base class? ... 
- SpriteBuilder实际操作中如何确定合适Breaking force的值
		确定Breaking force合适的值同样很单调,但是按照下面的方法也并不是完全不可能: 输入一个随意的值,比如说100 检查实际场景中关节是否能承受住物理物体,在完美的情况下物理物体将保持静止. ... 
- SpriteBuilder中关节的Breaking force属性
		在SpriteBuilder中三种物理关节都包含Breaking force区域在属性框中. 该属性被设置成关节可以承受的压力临界值.如果关节的压力超出了Breaking force中设置的值,则关节 ... 
- ElasticSearch 2 (3) - Breaking Changes
		ElasticSearch 2.1.1 (3) - Breaking Changes Search Changes search_type = scan Deprecated GET /my_ind ... 
- 绝命毒师第五季/全集Breaking Bad迅雷下载
		本季Breaking Bad Season 5(2012)看点:故事紧接着上一季,通过一场精心策划的大爆炸,沃尔特(布莱恩·科兰斯顿 Bryan Cranston 饰)终于除掉了长久以来的威胁古斯塔沃 ... 
- 绝命毒师第一季/全集Breaking Bad迅雷下载
		本季Breaking Bad Season 1(2008)看点:新墨西哥州的高中化学老师沃尔特·H·怀特(布莱恩·科兰斯顿 Bryan Cranston 饰)是拮据家庭的唯一经济来源.他大半生安分守己 ... 
- Codeforces Round #287 (Div. 2) E. Breaking Good 最短路
		题目链接: http://codeforces.com/problemset/problem/507/E E. Breaking Good time limit per test2 secondsme ... 
- Known BREAKING CHANGES from NH3.3.3.GA to 4.0.0
		Build 4.0.0.Alpha1 ============================= ** Known BREAKING CHANGES from NH3.3.3.GA to 4.0. ... 
- 【转载】【翻译】Breaking things is easy///机器学习中安全与隐私问题(对抗性攻击)
		原文:Breaking things is easy 译文:机器学习中安全与隐私问题(对抗性攻击) 我是通过Infaraway的那篇博文才发现cleverhans-blog的博客的,这是一个很有意思的 ... 
随机推荐
- Spark 总结2
			网页访问时候 没有打开 注意防火墙! 启动park shell bin下面的spark-shell 这样启动的是单机版的 可以看到没有接入集群中: 应该这么玩儿 用park协议 spark:/ ... 
- Luogu-4774 [NOI2018]屠龙勇士
			这题好像只要会用set/平衡树以及裸的\(Excrt\)就能A啊...然而当时我虽然看出是\(Excrt\)却并不会...今天又学了一遍\(Excrt\),趁机把这个坑给填了吧 现预处理一下,找出每条 ... 
- python机器学习——分词
			使用jieba库进行分词 安装jieba就不说了,自行百度! import jieba 将标题分词,并转为list seg_list = list(jieba.cut(result.get(" ... 
- 格点多边形面积公式(Pick定理)的一个形象解释(转)
			Pick定理:如果一个简单多边形(以下称为“多边形”)的每个顶点都是直角坐标平面上的格点,则称该多边形为格点多边形.若一个面积为S的格点多边形,其边界上有a个格点,内部有b个格点,则S=a/2+b-1 ... 
- IOS 被拒 关于  iPhone running iOS 10.3.1 on Wi-Fi connected to an IPv6 network.
			问题: Guideline 2.1 - Performance Thank you for your resubmission. However, we discovered one or more ... 
- CSS3的transform属性
			CSS3的一些属性可能比较新,有一些书从国外翻译到国内的时间上会延缓1-2年.所以有一些东西还需要及时整理. 下面说一下CSS3的一个属性:transform 其实字面上的意思已经很明显了就是变化,变 ... 
- ScrollView垂直滚动控件
			ScrollView垂直滚动控件 一.简介 二.方法 1)ScrollView垂直滚动控件使用方法 1.在layout布局文件的最外层建立一个ScrollView控件 2.在ScrollView控件中 ... 
- ActionContext实现原理
			StrutsPrepareAndExecuteFilter [http://www.tuicool.com/articles/NVNbYn] struts2 和 struts1 的一个重要区别就是它进 ... 
- orale存储技术
			一.存储的主要作用 1.海量存储 阵列存储 光盘存储 磁带存储 数据迁移 文件服务器,跨平台文件共享 2.容灾 数据备份及恢复:磁带.光盘.阵列 数据复制:本地镜像.远程镜像 3.高 ... 
- 开始学Python
			怎么说,整体还是比较愚昧的.不知道该干什么,大学里学过C++,C语言,忘的差不多了.毕业了做的是SAP,自学过一段JAVA.总是东一榔头西一棒子,借口还是多. 那就说一些现状嘛,语言重在的是应用这个方 ... 
