• D. Edge Split


    Problem - D - Codeforces

    思路:思路想到了,但是不知道用什么方法写。。首先我们先看只有一个树的情况,那么如果我们所有的边是一个颜色,那么答案是1+n,如果我们将其中的一条边变色,那么产生的答案是2+n-1,答案是不变的,如果有n条边,同样的方式我们如果所有的边为一个颜色,那么产生答案是1+n,但是n条边的树是存在环的,我们可以将环上的一条边变为另一个颜色那么答案就会变成1+n-1,所以我们通过总结发现,只要同一种颜色没有环,最终的答案就是最小的。那么现在问题就变成了构造两个无环图,我们可以先构造一颗树,那么最多会剩下3条边,如果剩下的三条边能够构成环,那么我们任意的选择一条边,加到树上,然后选择这条边的某个顶点,然后把这个顶点在树种的所有连边全都删除,除了新加的这条边,这样是一定不会有环的,因为首先树上是肯定没有环的,可能剩下的边存在环,因为新砍下来边是从树上看下来的,那么它们之间肯定是不能够形成环的,并且这写边与剩下的两个一定也不能够构成,因为没有重边的存在,要构成环那么只能是之前新加的那条边,所以肯定也不可能

    1. // Problem: D. Edge Split
    2. // Contest: Codeforces - Codeforces Round 819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    3. // URL: https://codeforces.com/contest/1726/problem/D
    4. // Memory Limit: 256 MB
    5. // Time Limit: 2000 ms
    6. #include
    7. #include
    8. #include
    9. #define fi first
    10. #define se second
    11. #define i128 __int128
    12. using namespace std;
    13. typedef long long ll;
    14. typedef double db;
    15. typedef pair<int,int> PII;
    16. const double eps=1e-7;
    17. const int N=5e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
    18. const long long int llINF=0x3f3f3f3f3f3f3f3f;
    19. inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    20. while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
    21. inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
    22. inline void write(ll x,char ch) {write(x);putchar(ch);}
    23. void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
    24. bool cmp0(int a,int b) {return a>b;}
    25. template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
    26. template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
    27. void hack() {printf("\n----------------------------------\n");}
    28. int T,hackT;
    29. int n,m,k;
    30. int ans[N];
    31. PII edge[N];
    32. int f[N];
    33. int h[N],e[M],ne[M],idx;
    34. bool st[N];
    35. void add(int a,int b) {
    36. e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    37. }
    38. int find(int x) {
    39. if(x!=f[x]) f[x]=find(f[x]);
    40. return f[x];
    41. }
    42. int dfs(int u,int fa,bool &flag) {
    43. if(st[u]) {
    44. flag=true;
    45. return 0;
    46. }
    47. st[u]=true;
    48. int res=1;
    49. for(int i=h[u];i!=-1;i=ne[i]) {
    50. int j=e[i];
    51. if(j==fa) continue;
    52. res+=dfs(j,u,flag);
    53. }
    54. return res;
    55. }
    56. bool check(vector &vis) {
    57. for(int i=0;i<=n;i++) h[i]=-1,st[i]=false;
    58. idx=0;
    59. for(int i=0;isize();i++) {
    60. int a=vis[i].fi,b=vis[i].se;
    61. add(a,b),add(b,a);
    62. }
    63. bool flag=false;
    64. if(dfs(vis[0].fi,-1,flag)==3&&flag) return true;
    65. else return false;
    66. }
    67. void solve() {
    68. n=read(),m=read();
    69. for(int i=1;i<=n;i++) f[i]=i;
    70. for(int i=1;i<=m;i++) ans[i]=0;
    71. vector vis;
    72. for(int i=1;i<=m;i++) {
    73. int a=read(),b=read();
    74. edge[i]={a,b};
    75. int fa=find(a),fb=find(b);
    76. if(fa!=fb) {
    77. f[fa]=fb;
    78. ans[i]=1;
    79. }else vis.push_back({a,b});
    80. }
    81. if(vis.size()==3) {
    82. if(check(vis)) {
    83. int id=vis[0].fi;
    84. for(int i=1;i<=m;i++) {
    85. if(!ans[i]) continue;
    86. if(edge[i].fi==id||edge[i].se==id) ans[i]=0;
    87. }
    88. for(int i=1;i<=m;i++) {
    89. if(edge[i].fi==vis[0].fi&&edge[i].se==vis[0].se) ans[i]=1;
    90. }
    91. }
    92. }
    93. for(int i=1;i<=m;i++) printf("%d",ans[i]);
    94. printf("\n");
    95. }
    96. int main() {
    97. // init();
    98. // stin();
    99. // ios::sync_with_stdio(false);
    100. scanf("%d",&T);
    101. // T=1;
    102. while(T--) hackT++,solve();
    103. return 0;
    104. }

  • 相关阅读:
    Dubbo实战运用Demo、SpringBoot整合Dubbo、Dubbo中超时重试和负载均衡策略
    python nltk 备份与恢复
    地球主题网页设计题材——大学生网页制作期末作业HTML+CSS+JS
    华为帐号多端协同,打造美好互联生活
    云原生:使用HPA和VPA实现集群扩缩容
    Docker高级——1 Docker复杂安装详说
    车牌识别定位 matlab基本方法和操作
    【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88
    Angular依赖注入模式的应用和玩法案例
    Springboot毕设项目系部期末考务管理系统ftt6kjava+VUE+Mybatis+Maven+Mysql+sprnig)
  • 原文地址:https://blog.csdn.net/zzzyyzz_/article/details/133148873