首页 > 其他分享 >洛谷P5683 [CSP-J2019 江西] 道路拆除

洛谷P5683 [CSP-J2019 江西] 道路拆除

时间:2024-09-22 16:12:09浏览次数:1  
标签:en dist int ed P5683 edge maxn 洛谷 J2019

立下flag:今天一定AC这道题!

题目意思:

思路:

然而并没有分。。

输出-1,祈求CCF的施舍(

30% 的数据,有 \(s_1 = s_2\)

求 1 号点到 \(s_1\) 最短路,再计算不需要的路径。
SPFA,启动!

#include<bits/stdc++.h>

using namespace std;

const int maxn=3010;
const int maxm=3010;

int m,n;
int s1,t1,s2,t2;
int en;
int fir[maxn];

struct edge{
	int v;
	int next;
}ed[maxm*2];

void add_edge(int u,int v)
{
	en++;
	ed[en].v=v;
	ed[en].next=fir[u];
	fir[u]=en;
}

queue<int>q;
int dist[maxn];
bool inque[maxn];

void spfa(int r)
{
	memset(dist,0x3f3f3f,sizeof(dist));
	dist[r]=0;
	q.push(r);
	inque[r]=true;
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		for(int i=fir[now];i;i=ed[i].next)
		{
			int p=ed[i].v;
			if(dist[p]>dist[now]+1){
				dist[p]=dist[now]+1;
				if(inque[p]==false){
					inque[p]=true;
					q.push(p);
				}
			}
		}
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add_edge(u,v);add_edge(v,u);//无向图 
	 }
	cin>>s1>>t1>>s2>>t2;
	spfa(1);
	cout<<m-dist[s1]<<endl;
	return 0; 
}

居然多了5分,35分直接拿下!

发现最佳情况一定是这样(如图)

当 \(a+b+c\) 的值最小的时候,方案是最优的,此时答案就是 \(m-(a+b+c)\)
那么我们就要找出这个 n
先算出 1、s1、s2这三个点分别到其余点的最短路,然后枚举 i 寻找最小值。

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int maxn=3010;
const int maxm=3010;
int ans=LLONG_MAX;

int m,n;
int s1,t1,s2,t2;
int en;
int fir[maxn];

struct edge{
	int v;
	int next;
}ed[maxm*2];

void add_edge(int u,int v)
{
	en++;
	ed[en].v=v;
	ed[en].next=fir[u];
	fir[u]=en;
}

queue<int>q;
int dist[4][maxn];
bool inque[maxn];

void spfa(int w,int r)
{
	for(int i=1;i<=n;i++)
	{
		dist[w][i]=0x3f3f3f;
	}
	dist[w][r]=0;
	q.push(r);
	inque[r]=true;
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		for(int i=fir[now];i;i=ed[i].next)
		{
			int p=ed[i].v;
			if(dist[w][p]>dist[w][now]+1){
				dist[w][p]=dist[w][now]+1;
				if(inque[p]==false){
					inque[p]=true;
					q.push(p);
				}
			}
		}
	}
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add_edge(u,v);add_edge(v,u);//无向图 
	 }
	cin>>s1>>t1>>s2>>t2;
	spfa(1,1);
	spfa(2,s1);
	spfa(3,s2);
	for(int i=1;i<=n;i++)
	{
		if(dist[1][i]+dist[2][i]<=t1&&dist[1][i]+dist[3][i]<=t2)
			ans=min(ans,dist[1][i]+dist[2][i]+dist[3][i]);
	}
	if(ans==LLONG_MAX) cout<<-1<<endl;
	else cout<<m-ans<<endl;
	return 0; 
}

但是这样居然只有95!?

一定要把inque数组清零!!!!

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int maxn=3010;
const int maxm=3010;
int ans=LLONG_MAX;

int m,n;
int s1,t1,s2,t2;
int en;
int fir[maxn];

struct edge{
	int v;
	int next;
}ed[maxm*2];

void add_edge(int u,int v)
{
	en++;
	ed[en].v=v;
	ed[en].next=fir[u];
	fir[u]=en;
}

queue<int>q;
int dist[4][maxn];
bool inque[maxn];

void spfa(int w,int r)
{
	for(int i=1;i<=n;i++)
	{
		dist[w][i]=0x3f3f3f;
	}
	memset(inque,false,sizeof(inque));
	dist[w][r]=0;
	q.push(r);
	inque[r]=true;
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		for(int i=fir[now];i;i=ed[i].next)
		{
			int p=ed[i].v;
			if(dist[w][p]>dist[w][now]+1){
				dist[w][p]=dist[w][now]+1;
				if(inque[p]==false){
					inque[p]=true;
					q.push(p);
				}
			}
		}
	}
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add_edge(u,v);add_edge(v,u);//无向图 
	 }
	cin>>s1>>t1>>s2>>t2;
	spfa(1,1);
	spfa(2,s1);
	spfa(3,s2);
	for(int i=1;i<=n;i++)
	{
		if(dist[1][i]+dist[2][i]<=t1&&dist[1][i]+dist[3][i]<=t2)
			ans=min(ans,dist[1][i]+dist[2][i]+dist[3][i]);
	}
	if(ans==LLONG_MAX) cout<<-1<<endl;
	else cout<<m-ans<<endl;
	return 0; 
}

简单捏~

标签:en,dist,int,ed,P5683,edge,maxn,洛谷,J2019
From: https://www.cnblogs.com/lazy-ZJY0307/p/18425466

相关文章

  • BFS 马的遍历————洛谷p1443
    马的遍历题目描述有一个\(n\timesm\)的棋盘,在某个点\((x,y)\)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。输入格式输入只有一行四个整数,分别为\(n,m,x,y\)。输出格式一个\(n\timesm\)的矩阵,代表马到达某个点最少要走几步(不能到达则输出\(-......
  • 洛谷 P1093 [NOIP2007 普及组] 奖学金
    [NOIP2007普及组]奖学金题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前555名学生发奖学金。期末,每个学生都......
  • BFS 颜色填涂———洛谷p1162
    填涂颜色题目描述由数字\(0\)组成的方阵中,有一任意形状的由数字\(1\)构成的闭合圈。现要求把闭合圈内的所有空间都填写成\(2\)。例如:\(6\times6\)的方阵(\(n=6\)),涂色前和涂色后的方阵如下:如果从某个\(0\)出发,只向上下左右\(4\)个方向移动且仅经过其他\(0\)的情况下......
  • dfs 油滴拓展——洛谷p1378
    油滴扩展题目描述在一个长方形框子里,最多有\(N\)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这\(N\)个点上放置油滴,才能使放置完毕后所有......
  • 【洛谷】P3128 [USACO15DEC] Max Flow P 的题解
    【洛谷】P3128[USACO15DEC]MaxFlowP的题解题目传送门题解谔谔,LCA+++树上差分,差点就被难倒了qaq今天就是CSP初赛了,祝大家也祝我自己rp++!!!其实是一道树上差......
  • 题解:洛谷P9934 [NFLSPC #6] 绝不能忘记的事……
    题目链接:洛谷P9934[NFLSPC#6]绝不能忘记的事……我hatelove大力分讨。这道题先分三种大情况:N在左边,N在中间,N在右边。声明:以下分类讨论中,a,b,c,d均为记住的字符串。记录操作N在左边当复制串形如Nab,可以用map<string,int>记录。当复制串形如NaH,那么......
  • 快速幂模板/洛谷P1226【模板】快速幂
    ​本题是CSP-J组的第四题。题意:给出一个有向图,当前在1号点,初始在时间0,必须在k的倍数的时间出发,且到终点的时间也必须是k的倍数。每条边有一个边权,只有在当前时间≥时才可以通过,且不能在原地不动,即每一个时间点必须走一条边。问从11号点出发到nn号时最早的时刻。(没......
  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • 洛谷题单指南-分治与倍增-P2345 [USACO04OPEN] MooFest G
    原题链接:https://www.luogu.com.cn/problem/P2345题意解读:有n头牛,每头牛都有听力v、坐标x两个属性,要计算每两头牛的max{vi​,vj​}×∣xi​−xj​∣之和。解题思路:首先想到的肯定是枚举法,需要O(n^2)的复杂度有没有优化的方法?可以采用分治法!由于是计算两头牛之间的max{vi​,......
  • 【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
    【洛谷】P11062【MX-X4-T2】「Jason-1」加法的题解题目传送门离CSP初赛只剩两天了,祝各位OIersrp++!!!题解挺有意思的一道思维题,不过比赛的时候没想出来。需要分类讨论两种情况:当a......