标签:bit pac closed for mes style span return 其他
题意:给出一个由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 }
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