社区讨论
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 条回复,欢迎继续交流。
正在加载回复...