P3905 道路重建
我一开始想错了,我的是类似kruskal,把毁坏的边从小到大加,并且判断联通性。但是这有一个问题,你可能会多加,就是这条边没用,但是它比较小,你也加上了。
居然还有10分,数据也是水水的。。。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define inf 2147483647
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar()
//by war
//2017.10.10
using namespace std;
int n,m,dd,A,B,x,y,v,t;
int a[][];
bool b[][];
int d[];
int ans; struct node
{
int l,r,v;
bool operator<(const node&aa)const
{
return v<aa.v;
}
}e[]; void in(int &x)
{
char c=g();x=;
while(c<''||c>'')c=g();
while(c<=''&&c>='')x=x*+c-'',c=g();
}
void o(int x)
{
if(x>)o(x/);
p(x%+'');
} int find(int x)
{
if(d[x]==x)return x;
d[x]=find(d[x]);
return d[x];
} int main()
{
in(n),in(m);
For(i,,n)
d[i]=i;
For(i,,m)
{
in(x),in(y),in(v);
a[x][y]=v;
a[y][x]=v;
}
in(dd);
For(i,,dd)
{
in(x),in(y);
b[x][y]=true;
b[y][x]=true;
}
in(A),in(B);
For(i,,n)
For(j,,n)
{
if(!b[i][j]&&a[i][j]>)
d[find(i)]=find(j);
if(b[i][j])
{
e[++t].l=i;
e[t].r=j;
e[t].v=a[i][j];
}
}
sort(e+,e+t+);
For(i,,t)
{
if(find(A)!=find(B))
{
if(find(e[i].l)!=find(e[i].r))
{
d[find(e[i].l)]=find(e[i].r);
ans+=e[i].v;
}
}
else
{
o(ans);
break;
}
}
return ;
}

正解是把未坏的边的权值设成0,坏的边的值不变,跑spfa即可。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define inf 2147483647
#define len 10010
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar() using namespace std;
int n,m,x,y,v,dd,A,B;
queue<int>q;
int d[];
bool vis[],b[][]; struct node
{
int n,v;
node *next;
}*e[len]; void push(int x,int y,int v)
{
node *p;
p=new node();
p->n=y;
p->v=v;
if(e[x]==NULL)
e[x]=p;
else
{
p->next=e[x]->next;
e[x]->next=p;
}
} void in(int &x)
{
int y=;
char c=g();x=;
while(c<''||c>'')
{
if(c=='-')
y=-;
c=g();
}
while(c<=''&&c>='')x=x*+c-'',c=g();
x*=y;
} void o(int x)
{
if(x<)
{
p('-');
x=-x;
}
if(x>)o(x/);
p(x%+'');
} void spfa(int x)
{
For(i,,n)
d[i]=inf;
d[x]=;
q.push(x);
node *p;
int t;
while(q.size()>)
{
t=q.front();
p=e[t];
vis[t]=true;
while(p!=NULL)
{
if(!b[t][p->n])
{
if(d[t]<d[p->n])
{
d[p->n]=d[t];
if(!vis[p->n])
q.push(p->n);
}
}
else
{
if(d[t]+p->v<d[p->n])
{
d[p->n]=d[t]+p->v;
if(!vis[p->n])
q.push(p->n);
}
}
p=p->next;
}
vis[t]=false;
q.pop();
}
} int main()
{
in(n),in(m);
For(i,,m)
{
in(x),in(y),in(v);
push(x,y,v);
push(y,x,v);
}
in(dd);
For(i,,dd)
{
in(x),in(y);
b[x][y]=true;
b[y][x]=true;
}
in(A),in(B);
spfa(A);
o(d[B]),p(' ');
return ;
}

P3905 道路重建的更多相关文章

  1. 洛谷——P3905 道路重建

    P3905 道路重建 题目描述 从前,在一个王国中,在n个城市间有m条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有d条道路被破坏了.国王想要修复国家的道路系统,现 ...

  2. 洛谷 P3905 道路重建 题解

    P3905 道路重建 题目描述 从前,在一个王国中,在\(n\)个城市间有\(m\)条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有\(d\)条道路被破坏了.国王想 ...

  3. P1359 租用游艇 && P3905 道路重建 ------Floyd算法

    P1359 租用游艇   原题链接https://www.luogu.org/problemnew/show/P1359 P3905 道路重建   原题链接https://www.luogu.org/ ...

  4. 洛谷 P3905 道路重建

    题目描述 从前,在一个王国中,在n个城市间有m条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有d条道路被破坏了.国王想要修复国家的道路系统,现在有两个重要城市A和B ...

  5. 洛谷P3905 道路重建

    题目:https://www.luogu.org/problemnew/show/P3905 分析: 此题是显然的最短路算法,只是看到一起删掉的一堆边感到十分棘手,而且还要求出的是最短添加边的总长度 ...

  6. 【最短路】道路重建 @upcexam5797

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 小L的家乡最近遭遇了一场洪水,城市变得面目全非,道路也都被冲毁了.生活还要继续,于是市政府决定重建城市中的道路. 在洪水到来前,城市中共有n ...

  7. [JZOJ 5465] [NOIP2017提高A组冲刺11.9] 道路重建 解题报告 (e-dcc+树的直径)

    题目链接: http://172.16.0.132/senior/#main/show/5465 题目: 小X所居住的X国共有n个城市,有m条无向道路将其连接.作为一个统一的国家,X 城的任意两个城市 ...

  8. 【洛谷P1272】道路重建

    题目大意:给定一个 N 个节点的树,求至少剪掉多少条边才能使得从树中分离出一个大小为 M 的子树. 题解:考虑树形 dp,定义 \(dp[u][i][t]\) 为以 u 为根节点与前 i 个子节点构成 ...

  9. [JZOJ5465]道路重建--边双缩点+树的直径

    题目链接 lueluelue 分析 这鬼题卡了我10发提交,之前做过一道类似的题目:https://rye-catcher.github.io/2018/07/09/luogu%E9%A2%98%E8 ...

随机推荐

  1. Flink流处理操作符

    一.工程创建与准备 使用maven进行工程创建,且采用提供的flink-quickstart模版,便利很多.

  2. internal in C#

    说白了 被 internal 修饰的东西只能在本程序集(当前项目)内被使用. 被 protected internal 修饰的属性/方法 可以在其他项目中,被派生类使用 例如有两个项目app1和app ...

  3. 何凯文每日一句打卡||DAY5

  4. 移动端手势库hammerJS 2.0.4官方文档翻译(转)

    hammerJS是一个优秀的.轻量级的触屏设备手势库,现在已经更新到2.04版本,跟1.0版本有点天壤地别了,毕竟改写了事件名并新增了许多方法,允许同时监听多个手势.自定义识别器,也可以识别滑动方向. ...

  5. 20155318 2016-2017-2 《Java程序设计》第六周学习总结

    20155318 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 学习目标 理解流与IO 理解InputStream/OutPutStream的继承架构 理解 ...

  6. CSS3 响应式布局: @media (min/max-width:***) @font-face

    响应式布局 responsive design @media 属性 bootstrap  css 分析: @media (min-width:768px){ body{***} } use @medi ...

  7. [CEOI2015 Day2]世界冰球锦标赛 (双向搜索)

    题目描述 [CEOI2015 Day2]世界冰球锦标赛译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.Bobek ...

  8. linux下搭建我的世界spongeforge 服务器 (海绵端)

    以下我用的都是1.10.2版本 且以下用的服务器连接管理软件有WinSCP.Xshell 5 首先,去下载一个MC1.10.2的纯净服务端,这个不会很难,百度一下! 比如我下的文件就叫minecraf ...

  9. find查找时排除目录及文件

    查找根目录下大于500M的文件,排除/proc目录 find / ! -path "/proc/*" -type f -size +500M | sort -rh|xargs ls ...

  10. MAC连接安卓手机通过adb指令安装apk

    Android的apk可以通过adb命令来安装.在MAC电脑上,如果想通过命令行的方式给安卓手机安装apk,需要做以下操作: 一句话概括就是:将安卓SDK的adb命令添加到环境变量中,然后通过adb ...