P3905 道路重建

时间:2022-10-31 20:09:38

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 租用游艇 &amp&semi;&amp&semi; 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. 【最短路】道路重建 &commat;upcexam5797

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

  7. &lbrack;JZOJ 5465&rsqb; &lbrack;NOIP2017提高A组冲刺11&period;9&rsqb; 道路重建 解题报告 (e-dcc&plus;树的直径)

    题目链接: 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. &lbrack;JZOJ5465&rsqb;道路重建--边双缩点&plus;树的直径

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

随机推荐

  1. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  2. linux终端terminal个性化配置&lpar;转&rpar;

    http://blog.csdn.net/pipisorry/article/details/39584489 {本文介绍Linux终端字体颜色设置.终端提示符显示内容设置.自定义alias命令} l ...

  3. uva10160 Servicing Stations

    The input consists of more than one description of town (but totally, less than ten descriptions). E ...

  4. 网页嵌入swf代码

    <object class id="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://dow ...

  5. Centos7安装杀毒软件ClamAV

    Clam AntiVirus(ClamAV)是免费而且开放源代码的防毒软件,软件与病毒码的更新皆由社群免费发布.目前ClamAV主要是使用在Linux.FreeBSD等Unix-like系统架设的邮件 ...

  6. WP开发笔记——WP7 SDK使用技巧

    俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...

  7. pc版qq登录及移动版qq登录的申请过程

    1.在哪里接入?    网站接入QQ登录在QQ互联(https://connect.qq.com)上创建:移动应用也可以在QQ互联(https://connect.qq.com)上创建,但是不推荐如此 ...

  8. python 获取list的下标

    print(your_list.index('your_item')) #your_list为列表名称 your_item为需要修该的数据

  9. 物联网架构成长之路&lpar;5&rpar;-EMQ插件配置

    1. 前言 上一小结说了插件的创建,这一节主要怎么编写代码,以及具体流程之类的.2. 增加一句Hello World 修改 ./deps/emq_plugin_wunaozai/src/emq_plu ...

  10. 【Codeforces666E】Forensic Examination 后缀自动机 &plus; 线段树合并

    E. Forensic Examination time limit per test:6 seconds memory limit per test:768 megabytes input:stan ...