首页 > 编程语言 >2021 年百度之星·程序设计大赛 - 初赛二 1003 魔怔(并查集,联通性,欧拉回路)

2021 年百度之星·程序设计大赛 - 初赛二 1003 魔怔(并查集,联通性,欧拉回路)

时间:2023-02-08 16:04:32浏览次数:47  
标签:cout int sum 查集 白边 初赛 ++ 1003 find


problem

2021 年百度之星·程序设计大赛 - 初赛二 1003 魔怔(并查集,联通性,欧拉回路)_ci

solution

  • 发现除了起点和终点,剩下所有点周围的边都会被恰经过偶数次,所以这些点初始连向了偶数条白边。
  • 考虑由白边连接形成的图每个连通块中度数为奇数的点一定为偶数个。
  • 所以起点所在连通块最多有两个点度数为奇数,且包含起点,不包含起点的连通块不能有点度数为奇数。(或者由欧拉回路的性质可得,如果有大于两个度为奇数的点一定是不能完成任务的)
  • 所以每个包含白边的连通块都可以一笔画,每条白边都恰经过一次且不会经过黑边。答案即为 白边个数 +2 ( 包含白边或包含起点的连通块个数 -1)。
//没补完.jpg
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1010;

int fa[maxn+10];
void init(int n){for(int i = 1; i <= n; i++)fa[i]=i;}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x, int y){x=find(x);y=find(y);if(x!=y)fa[x]=y;}

int e[maxn][maxn], in[maxn];

int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T; cin>>T;
while(T--){
memset(e,0,sizeof(e));
memset(in,0,sizeof(in));

int n, rt; cin>>n>>rt;
int cnt = 0; init(n);
for(int i = 2; i <= n; i++){
string s; cin>>s;
for(int j = 0; j < i-1; j++){
e[i][j+1] = e[j+1][i]= s[j]-'0';
if(e[i][j+1]==0){
cnt++;
in[i]++; in[j+1]++;//累加度数
merge(i,j+1);
}
}
}
//cout<<cnt+2<<"\n";

LL ans = 0, sum = 0, ok=0;
map<int,int>mp;
for(int i = 1; i <= n; i++){
if(in[i]%2==1)ans++;
sum += in[i];
if(in[i]){
int s = find(i);
if(mp[s]==0){ok++; mp[s]=1;}
}
}
if(sum==0){cout<<"0\n"; continue;}
sum = sum/2+(ok-1)*2;
if(ans>2){cout<<"-1\n"; continue;}
else{
if(in[rt]){//在
if(in[rt]%2==0){//偶数
if(ans)cout<<"-1\n";
else cout<<sum<<"\n";
}else{//奇数
cout<<sum<<"\n";
}
}else{//不在
if(ans==0)cout<<sum+2<<"\n";
else cout<<"-1\n";
}
}


continue;
for(int i = 1; i <= n; i++){
for(int j=1; j <= n; j++)cout<<e[i][j]<<" ";
cout<<"\n";
}
}

return 0;
}


标签:cout,int,sum,查集,白边,初赛,++,1003,find
From: https://blog.51cto.com/gwj1314/6044573

相关文章

  • 【Baltic2003】【BZOJ1370】Gang团伙(并查集,拆点)
    problem给定n个人朋友的朋友是朋友,敌人的敌人是朋友朋友之间组成一个团伙,求团伙数solution将每个点x拆成两个:x和x+n(分别表示x的朋友和敌人)如果x和y是朋友,就将x和y合并如果x......
  • 并查集判断(DSU)二分图
    并查集(DSU)判断二分图题目链接二分图性质当且仅当图中不存在奇数环偶数环时可以扭成这样但奇数环则不可以从染色法的角度来考虑:假设一个二分图中左边标号为1......
  • 种类并查集 洛谷 P2024 食物链
    题目描述动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道......
  • 带权并查集 区间统计
    带权并查集区间统计例题:​​HDU ZjnuStadium​​(模板)​​HDU3038HowManyAnswersAreWrong​​与普通并查集不同是新增加一个属性:dist[a]:表示a到父亲节点的距离操......
  • 【bzoj4668】冷战 (并查集按秩合并+朴素LCA)
    题目描述1946年3月5日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕。美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国......
  • POJ 1611--The Suspects【并查集水题】
    TheSuspectsSevereacuterespiratorysyndrome(SARS),anatypicalpneumoniaofunknownaetiology,wasrecognizedasaglobalthreatinmid-March2003.Tominim......
  • poj 1182 食物链(并查集)
    食物链TimeLimit: 1000MS MemoryLimit: 10000KTotalSubmissions: 33156 Accepted: 9626Description动物王国中有三类动物A,B,C,这三类动物的食物链构成......
  • 第五届“强网”拟态防御国际精英挑战赛初赛——Web Misc
    之前团队参加了第五届“强网”拟态防御国际精英挑战赛初赛,又是收获满满的一次,和全国很多大佬们一块同台竞争,最重要的是,通过比赛我们学到了很多新的方法和技能,下面让我们一块......
  • 并查集
    并查集并查集基础定义并查集是一种树型的数据结构,主要用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。一些常见的用途有连通子图、最小生成树的Kruskal算法和......
  • 并查集
    ATC(ABC287CPathGraph?)#include<bits/stdc++.h>usingnamespacestd;structDSU{vector<int>f,siz;DSU(intn):f(n),siz(n,1){iota(f.begin()......