【题目链接】:https://vjudge.net/contest/164884#problem/D

【题意】



给你一张图;

图中有些路是完好的;但有些路还没修好;

先不管路有没有修好;

问你从起点到终点的最短路;

如果最短路上有没修好的路,那么你要把它修好;

而不在最短路上的,如果是完好的路,你需要把它摧毁(???)

让你选出这么一条最短路,使得受影响的路(被摧毁的和修好的路的数目总和)最少;

【题解】



受影响的路即是:

最短路上的没修好的路+非最短路上的修好的路;

也即;

最短路的长度-最短路上的修好的路+整张图上修好的路-最短路上修好的路

也即

最短路的长度+整张图上修好的路-2*最短路上修好的路;

要让受影响的路最少;

即让最短路上修好的路最大就好;

这个可以在做spfa的时候顺便得到;

即最短路相同,再判断一下修好的路的个数;

按照那个公式算出受影响的路;

然后记录每个点的前缀;

最短路上没修好的路把它修好(输出);

不是最短路上的修好的路把它破坏(输出);



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0); const int N = 1e5+50;
const int INF = 0x3f3f3f3f; struct abc{
int x,y,z;
}; int n,m,all1,k;
abc a[N];
vector <pii> G[N];
pii dis[N],pre[N];
queue <int> dl;
bool inq[N],bo[N]; void spfa()
{
rep1(i,1,n)
dis[i] = mp(INF,0);
dis[1].fi = 0;
dl.push(1);
inq[1] = true;
while (!dl.empty())
{
int x = dl.front();
dl.pop();
inq[x] = false;
for (pii temp:G[x])
{
int y = temp.fi,w = a[temp.se].z;
if (dis[y].fi>dis[x].fi+1 || (dis[y].fi==dis[x].fi+1 && dis[y].se<dis[x].se+w))
{
dis[y].fi = dis[x].fi+1;
dis[y].se = dis[x].se+w;
pre[y] = mp(x,temp.se);
if (!inq[y])
{
inq[y] = true;
dl.push(y);
}
}
}
}
} int main()
{
//Open();
cin >> n >> m;
rep1(i,1,m)
{
cin >> a[i].x >> a[i].y >> a[i].z;
G[a[i].x].pb(mp(a[i].y,i));
G[a[i].y].pb(mp(a[i].x,i));
all1+=a[i].z;
}
spfa();
k = dis[n].fi+all1-2*dis[n].se;
cout << k << endl;
int now = n;
while (now!=1)
{
int temp = pre[now].se;
if (a[temp].z==0)
cout << a[temp].x <<' '<<a[temp].y<<' '<<1<<endl;
bo[temp] = 1;
now = pre[now].fi;
}
rep1(i,1,m)
if (!bo[i] && a[i].z==1)
cout << a[i].x <<' '<<a[i].y<<' '<<0<<endl;
return 0;
}

【codeforces 507E】Breaking Good的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. 思维题+栈的应用——cf1092D有意思

    第一例很简单,把两个差为偶数的列不断合并即可 这种不需要撤销的合并相连数直接用栈来做 /* 如果相邻两列高度差为偶数 那么可以直接消去 */ #include<bits/stdc++.h> ...

  2. css3@media实现原理

    window.matchMedia() 基本用法 window.matchMedia方法用来检查CSS的mediaQuery语句.各种浏览器的最新版本(包括IE 10+)都支持该方法,对于不支持该方法 ...

  3. 4_1.springboot2.xWeb开发使用thymeleaf

    1.简介 如果使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来: ...

  4. 1.2python基础_数字类型_数字(Number)类型

    一.整型(int型.整数) 整型 等价于C中的有符号长整型(long) 与系统的最大整型一致(如32位机器上的整型是32位,64位机器上的整型是64位), 可以表示的整数范围在[-sys.maxint ...

  5. <Django>第一篇:入门的例子

    1.MVT框架 Model(模型):数据库交互相关.在这部分一般需要进行三个操作: (1)面向数据库:模型对象.列表 (2)定义模型类:指定属性及类型,确定表结构(设计表),需要迁移(生成表) (3) ...

  6. 滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919

    大致题意: Description 难怪Michael喜欢滑雪,因为滑雪确实很刺激.为了获得加速度,滑雪道必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一 ...

  7. wpf datepicker 样式

    在项目中用到的 <Style TargetType="{x:Type DatePicker}"> <Setter Property="Foregroun ...

  8. 如何为ABAP程序添加权限检查

    一.确认权限对象,及其关联字段: TCode: SU21 例如权限对象"M_MSEG_WMB",它关联字段为"WERKS",详见下图: 二.在ABAP代码中添加 ...

  9. 安装tomcat8.5

    1.去官网下载安装文件 网址:https://tomcat.apache.org/download-80.cgi 2.在安装目录的bin中运行startup.bat即可启动 3.启动好tomcat后, ...

  10. [JZOJ5232] 【NOIP2017模拟A组模拟8.5】带权排序

    题目 题目大意 有一个数列AAA,数列上的每个数都是在[li,ri][l_i,r_i][li​,ri​]范围内随机的数. 将这个数列进行稳定排序,得到每个位置在排序后的排名pip_ipi​. f(A) ...