社区讨论

5pts求调马蜂很好

P7687[CEOI 2005] Critical Network Lines参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@miec9527
此快照首次捕获于
2025/11/25 16:53
3 个月前
此快照最后确认于
2025/11/25 17:54
3 个月前
查看原帖
RT
CPP
#include<bits/stdc++.h>
using namespace std;
#define akioi ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define db double
#define ull unsigned long long
#define endl '\n'
const int NR = 1e5 + 10 , MR = 1e6 + 10;
int gasoline_node_number[NR] , diesel_node_number[NR];
struct node
{
	int x,y;
	int nxt;
}e[2 * MR];
int h[NR];
int newm = 0;
void addedge(int x,int y)
{
	e[++newm] = {x,y,h[x]};
	h[x] = newm;
}

bool tarjanvis[NR] , isinst[NR];
int dfn[NR] , low[NR];
int node_number = 0;
stack<int> st;
int scc_number[NR] , scccnt = 0;

vector<int> bridge_number;

void tarjan(int u , int father)
{
	st.push(u);
	isinst[u] = tarjanvis[u] = 1;
	dfn[u] = low[u] = ++node_number;
	for(int i=h[u];i!=-1;i=e[i].nxt)
	{
		int v = e[i].y;
		if(v == father)continue;
		if(!tarjanvis[v])
		{
			tarjan(v , u);
			low[u] = min(low[u] , low[v]);
			if(dfn[u] < low[v])
			{
				bridge_number.push_back(i);
//				cout<<u<<" "<<v<<endl;
			}
		}
		else low[u] = min(low[u] , dfn[v]);
	}
	if(low[u] == dfn[u])
	{
		scccnt ++ ;
		scc_number[u] = scccnt;
		while(1)
		{
			int v = st.top();
			st.pop();
			isinst[v] = 0 , scc_number[v] = scccnt;
			if(u == v)break;
		}
	}
	return ;
}

bool bfs_vis[NR];
bool is_gasoline_node[NR] , is_diesel_node[NR];

bool bfs(int x , int special_edge)
{
	memset(bfs_vis,0,sizeof(bfs_vis));
	queue<int> q;
	q.push(x);
	bool has_gasoline = false , has_diesel = false;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		if(is_gasoline_node[u])has_gasoline = true;
		if(is_diesel_node[u])has_diesel = true;
		if(has_gasoline && has_diesel)return true;
		for(int i = h[u];i!=-1;i = e[i].nxt)
		{
			if(special_edge == i)continue;
			int v = e[i].y;
			if(bfs_vis[v])continue;
			q.push(v);
			bfs_vis[v] = 1;
		}
	}
	return (has_diesel && has_gasoline);
}

int main()
{
	akioi
	memset(h , -1 , sizeof(h));
	int n,m,k,l;
	cin>>n>>m>>k>>l;
	for(int i=1;i<=k;i++)
	{
		cin>>gasoline_node_number[i];
		is_gasoline_node[gasoline_node_number[i]] = 1;
	}
	for(int i=1;i<=l;i++)
	{
		cin>>diesel_node_number[i];
		is_diesel_node[diesel_node_number[i]] = 1;
	}
	for(int i=1;i<=m;i++)
	{
		int node_number_x,node_number_y;
		cin>>node_number_x>>node_number_y;
		addedge(node_number_x , node_number_y);
		addedge(node_number_y , node_number_x);
	}
	for(int i=1;i<=n;i++)if(!tarjanvis[i])tarjan(i , 0);
	int overall_ans = 0;
	vector<pair<int,int>> overallans_node_numbers;
	for(auto op : bridge_number)
	{
		int u = e[op].x , v = e[op].y;
		if(bfs(u , op) && bfs(v , op))continue;
		overall_ans++;
//			cout<<u<<" "<<v<<endl;
		overallans_node_numbers.push_back({u,v});
	}
	cout<<overall_ans<<endl;
	for(auto x : overallans_node_numbers)
	{
		cout<<x.first<<" "<<x.second<<endl;
	}
	return 0;
}
/*
思路1:
tarjan把桥求出来,暴力判断一下即可>_<艳丽
应该要超时。。。
*/

回复

0 条回复,欢迎继续交流。

正在加载回复...