码迷,mamicode.com
首页 > 其他好文 > 详细

The 2019 ICPC Asia Shanghai Regional Contest

时间:2020-09-17 13:00:39      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:bit   pac   closed   for   mes   style   span   return   其他   

K.Color Graph

题意:给出一个由n个点和m 条边组成的无向图,保证无自环无重边,初始时所有的边都是白色的,每一次都可以选择一条边把它染成红色,不过需要保证不存在红色的奇环,现在要求尽可能多的将白边染成红色,问最多能染多少条边

题解

  • 看到奇环首先想到二分图:所以这道题就转化成了一个二分图问题:就是要找尽可能多的边使得这些边组成的图是二分图。
  • 看到数据范围首先想到状压(二进制):用一个二进制串表示每个点的状态(即是在二分图左半部分还是在右半部分呢)

ii位二进制位为11,说明编号为ii的节点在二分图左半部分。为0则是在右半部分。对于二进制为11的点,我们把它们染色为1,对于二进制位为0的点,我们染色为0,然后遍历mm条边,如果边的两个端点颜色不同,那么符合条件的边的个数加11,如果端点颜色一样,即两个点同在左半部或者右半部, 则不能选择这条边

技术图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define endl ‘\n‘
 5 const int maxn = 17*17;
 6 int a[maxn],b[maxn];
 7 bool vis[17];
 8 
 9 int main()
10 {
11     int t,cas=0;cin>>t;
12     while( t-- ){
13         int n,m; cin>>n>>m;
14         for(int i=1;i<=m;i++) cin>>a[i]>>b[i];
15         int ans=0;
16         for(int j=0;j<1<<n;j++){    //枚举状态
17             for(int k=0;k<16;k++){  //遍历状态的每一位
18                 vis[k]=(j>>k)&1;    //如果第k位为1,染色为编号为i的节点1; 否则染色为0
19             }
20             int num=0;
21             for(int i=1;i<=m;i++){
22                 num+=vis[a[i]]^vis[b[i]];//第i条边的两段的点颜色一样异或为0代表不取,不一样以后为1则取
23             }
24             ans=max(ans,num);
25         }
26         printf("Case #%d: %d\n",++cas,ans);
27     }
28     return 0;
29 }
View Code

 

B.Prefix Code

题意:给出n个字符串(长度不超过10),让我们判断是否存在某一个字符串是其他字符串的前缀

思路:直接暴力判断

 1     #include<bits/stdc++.h>
 2     using namespace std;
 3     const int maxn=1e4+10;
 4     map<string,int>mp;
 5     string tmp[maxn];
 6     int main()
 7     {
 8         int T;
 9         scanf("%d",&T);
10         int Case=0;
11         while(T--){
12             mp.clear();
13             int n;
14             scanf("%d",&n);
15             for(int i=1;i<=n;i++){
16                 cin>>tmp[i];
17                 mp[tmp[i]]++;
18             }
19             int flag=0;
20             for(int i=1;i<=n;i++){
21                 if(flag==-1) break;
22                 int len=tmp[i].size();
23                 for(int j=1;j<len;j++){
24                     string t=tmp[i].substr(0,j);
25                     if(mp[t]) flag=-1;
26                 }
27                 if(mp[tmp[i]]>=2) flag=-1;
28             }
29             printf("Case #%d: ",++Case);
30             if(flag==-1) printf("No\n");
31             else printf("Yes\n");
32         }
33         return 0;
34     }

 

The 2019 ICPC Asia Shanghai Regional Contest

标签:bit   pac   closed   for   mes   style   span   return   其他   

原文地址:https://www.cnblogs.com/pangbi/p/13613192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!