Gym-101630C:Connections(生成树&构造)
2018-07-16 22:11
381 查看
题意:给定N点,M条有向边,满足任意点可以到达任意点。现在叫你保留2*N边,任然满足任意点可以到达任意点,输出删除的边。
思路:从1出发,DFS,得到一颗生成树,有N-1条边。反向建题。还是从1出发,得到一颗生成树,这2N-2条边显然可以满足任意点互通。然后随便选两边即可。 (任意点u->v,至少有u->1->v满足。
思路:从1出发,DFS,得到一颗生成树,有N-1条边。反向建题。还是从1出发,得到一颗生成树,这2N-2条边显然可以满足任意点互通。然后随便选两边即可。 (任意点u->v,至少有u->1->v满足。
#include<bits/stdc++.h> #define pii pair<int,int> #define ll long long const int maxn=200010; using namespace std; int u[maxn],v[maxn],vis1[maxn],vis2[maxn],N; vector<int>G1[maxn],G2[maxn]; map<pii,int>mp; void dfs1(int u) { vis1[u]=1; int L=G1[u].size(); for(int i=0;i<L;i++) if(!vis1[G1[u][i]]) mp[make_pair(u,G1[u][i])]=1,dfs1(G1[u][i]); } void dfs2(int u) { vis2[u]=1; int L=G2[u].size(); for(int i=0;i<L;i++) if(!vis2[G2[u][i]]) mp[make_pair(G2[u][i],u)]=1,dfs2(G2[u][i]); } int main() { int T,M,i,j; scanf("%d",&T); while(T--){ scanf("%d%d",&N,&M); mp.clear(); memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); for(i=1;i<=N;i++) G1[i].clear(),G2[i].clear(); for(i=1;i<=M;i++){ scanf("%d%d",&u[i],&v[i]); G1[u[i]].push_back(v[i]); G2[v[i]].push_back(u[i]); } dfs1(1); dfs2(1); int cnt=M-N-N; for(i=1;i<=M&&cnt;i++){ if(!mp[make_pair(u[i],v[i])]) printf("%d %d\n",u[i],v[i]),cnt--; } } return 0; }
相关文章推荐
- Gym - 101630C C. Connections
- [构造] Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks
- [构造] Codeforces Gym 101173 CERC 16 K & BZOJ 4796 Key Knocking
- C#使用比较操作符(!=、<、>、<=、>=)的字符串构造Lambda表达式树,并生成委托执行
- UVaLive 6588 && Gym 100299I (贪心+构造)
- VS调试错误:若要调试此模块,请将其项目生成配置更改为"调试"模式
- 记Linux java tomcat增加SSL生成&配置全程步骤
- ERROR 1203 (42000): User root already has more than 'max_user_connections' active connections
- Kruskal算法构造图的最小生成树
- 曼哈顿最小距离生成树(poj 3241&& UVALive 3662)
- ibatis [转]ibatis自动生成工…
- java动态生成实例笔记<持续更新中>
- 版本4.0aimkind字典中显示中文含义和类型名称,并过滤生成aimcode字典。构造动态字典。
- bzoj 5044 岛屿生成 构造
- @GeneratedValue jap&hibernate生成字段策略
- 键盘>构造>cherry>看了个好故事
- GYM 100488 Construct a Permutation(构造|想法)
- 两个函数生成的函数群的构造过程
- <PY>构造指定大小的笛卡尔空间
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本