cf 507E. Breaking Good
因为要求是在保证最短路的情况下花费是最小的,所以(先保证最短路设为S吧)
那么花费就是最短路上的新建边条数A+剩余拆掉边的条数B,而且总的原有好的边是一定的,所以,只要使得A尽量小,那么B就大,所以要拆掉的边也会少啦。
所以SPFA以最短路为基础,维护出一个A最小就好。(路径什么的,,from[...])
#include<bits/stdc++.h>
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
#define LL long long
#define N 100005
using namespace std;
inline LL ra()
{
LL x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
struct node{
int from,to,next,z;
}e[N<<];
int sum[N<<],dis[N<<],head[N<<],cnt;
int q[N<<],tot1,n,m,from[N<<];
bool vis[N<<],inq[N<<];
void insert(int x, int y, int z)
{
e[cnt].to=y;
e[cnt].from=x;
e[cnt].next=head[x];
e[cnt].z=z;
head[x]=cnt++;
}
void SPFA()
{
for (int i=; i<=n; i++) sum[i]=dis[i]=inf;
sum[]=dis[]=; q[]=; int l=,r=; from[]=-;
while (l<=r)
{
int x=q[l++];
for (int i=head[x];i!=-;i=e[i].next)
{
if (dis[e[i].to]==dis[x]+ && e[i].z==)
{
if (sum[e[i].to]>sum[x]+)
{
sum[e[i].to]=sum[x]+;
from[e[i].to]=i;
if (!inq[e[i].to])
{
q[r++]=e[i].to;
inq[e[i].to]=;
}
}
}
if (dis[e[i].to]==dis[x]+ && e[i].z)
{
if (sum[e[i].to]>sum[x])
{
sum[e[i].to]=sum[x];
from[e[i].to]=i;
if (!inq[e[i].to])
{
q[r++]=e[i].to;
inq[e[i].to]=;
}
}
}
if (dis[e[i].to]>dis[x]+)
{
dis[e[i].to]=dis[x]+;
from[e[i].to]=i;
if (e[i].z==) sum[e[i].to]=sum[x]+;
else sum[e[i].to]=sum[x];
if (!inq[e[i].to])
{
inq[e[i].to]=;
q[r++]=e[i].to;
}
}
}
inq[x]=;
}
// cout<<dis[n];while (1);
}
void print()
{
cout<<sum[n]+(tot1-(dis[n]-sum[n]))<<endl;
int i=from[n];
while (i!=-)
{
if (e[i].z==)
printf("%d %d 1\n",e[i].from,e[i].to);
else vis[i]=;
i=from[e[i].from];
}
for (int i=; i<=cnt; i++)
{
if (e[i].z== && vis[i]== && vis[i^]==)
{
vis[i]=;
printf("%d %d 0\n",e[i].from,e[i].to);
}
}
}
int main()
{
n=ra(); m=ra();
memset(head,-,sizeof(head));
for (int i=; i<=m; i++)
{
int x=ra(),y=ra(),z=ra();
if (z==) tot1++;
insert(x,y,z); insert(y,x,z);
}
SPFA();
print();
return ;
}
cf 507E. Breaking Good的更多相关文章
- CodeForces 507E Breaking Good 2维权重dij
Breaking Good 题解: 2维权重dij, 先距离最短, 后改变最小. 在这个题中, 如果要改变最小, 则让更多的可用边放进来. 然后可以用pre存下关键边. 代码: ...
- [Codeforces 507E] Breaking Good
[题目链接] https://codeforces.com/contest/507/problem/E [算法] 首先BFS求出1到其余点的最短路 , N到其余点的最短路,记为distA[]和dist ...
- 【codeforces 507E】Breaking Good
[题目链接]:https://vjudge.net/contest/164884#problem/D [题意] 给你一张图; 图中有些路是完好的;但有些路还没修好; 先不管路有没有修好; 问你从起点到 ...
- CF习题集二
CF习题集二 一.CF507E Breaking Good 题目描述 \(Breaking Good\)这个游戏对于有经验的玩家来说也有一定的难度. 游戏的主角小明希望加入一个叫斧头帮的犯罪团伙.这个 ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
随机推荐
- hibernate部分源码解析and解决工作上关于hibernate的一个问题例子(包含oracle中新建表为何列名全转为大写且通过hibernate取数时如何不用再次遍历将列名(key)值转为小写)
最近在研究系统启动时将数据加载到内存非常耗时,想着是否有办法优化!经过日志打印测试发现查询时间(查询时间:将数据库数据查询到系统中并转为List<Map>或List<*.Class& ...
- QQ企业通---DllImport
1.DllImport 是什么? DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL(托管/非托管是微软的.net fr ...
- Google宣布安全奖励项目(GPSRP)覆盖上亿的 Android 应用程序
自 2010 年推出除虫赏金项目以来,谷歌已经向安全研究人员支付了超过 1500 万美元的奖励.今天,这家科技巨头宣布进一步拓展 Google Play 安全奖励项目(GPSRP)的范围,以覆盖上亿的 ...
- 第2节 网站点击流项目(下):7、hive的级联求和
一.hive级联求和的简单例子: create table t_salary_detail(username string,month string,salary int)row format del ...
- synchronized和锁(ReentrantLock) 区别
synchronized和锁(ReentrantLock) 区别 java的两种同步方式, Synchronized与ReentrantLock的区别 并发(一):理解可重入锁 可重入锁和不可重入锁 ...
- IO、阻塞和非阻塞、目录
系统函数.系统调用 系统函数 open/close函数 函数原型 man 2 open // open, creat - open and possibly create a file or devi ...
- 045、Java中使用if语句进行判断
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- DCGAN生成目标训练图片
前言: GAN的原理很简单,但是它有很多变体,如:DCGAN.CycleGAN.DeblurGAN等,它们也被用在不同地方,本文将用到DCGAN来生成头像图片,可以做到以假乱真的地步. 1.首先调用程 ...
- python中numpy矩阵运算操作大全(非常全)!
python中numpy矩阵运算操作大全(非常全) //2019.07.10晚python矩阵运算大全1.矩阵的输出形式:对于任何一个矩阵,python输出的模板是:import numpy as n ...
- Vuex源码分析(转)
当我们用vue在开发的过程中,经常会遇到以下问题 多个vue组件共享状态 Vue组件间的通讯 在项目不复杂的时候,我们会利用全局事件bus的方式解决,但随着复杂度的提升,用这种方式将会使得代码难以维护 ...