Poj 2513 Colored Sticks

本文介绍了一种使用并查集和端点度数来判定欧拉图的方法,并实现了离散化二分搜索算法。通过输入边的两个顶点,程序能够判断所给的图是否为欧拉图,即是否存在一条路径遍历每条边恰好一次。
部署运行你感兴趣的模型镜像

欧拉图判定(并查集,端点度数)

离散化Bsearch

1Y

#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#define N 250003 
using namespace std;
struct chop{
	char s[12];
	bool operator < (const chop &tp)const{return strcmp(s,tp.s)<0;}
	bool operator ==(const chop &tp)const{return strcmp(s,tp.s)==0;}
	}tp,rp;
vector<chop>L;
int B_search(chop tp){
	int l=0,r=L.size()-1;
	while(r>l){
		if(L[r]==tp)return r;
		if(L[l]==tp)return l;
		int mid=(l+r)/2;
		if(L[mid]==tp)return mid;
		else if(tp<L[mid])r=mid;
		else l=mid;
		}
	}
char map[N][2][12];
int ft[N<<1];
int sum[N<<1];
void ini(int x){
	int i;
	for(i=0;i<x;i++)ft[i]=i;
	for(i=0;i<x;i++)sum[i]=0;
	}
int find(int x){ return (x==ft[x]) ? x : ft[x]=find(ft[x]); }
void merge(int a,int b){
	int ra=find(a),rb=find(b);
	ft[ra]=rb;
	sum[a]++;sum[b]++;
	}
int main(){
	L.clear();
	int t=1;
	while(scanf("%s%s",map[t][0],map[t][1])!=EOF){
		strcpy(tp.s,map[t][0]);
		L.push_back(tp);
		strcpy(tp.s,map[t][1]);
		L.push_back(tp);
		t++;
		}
	sort(L.begin(),L.end());
	L.erase(unique(L.begin(),L.end()),L.end());
	int n=L.size(),i;
	ini(n);
	for(i=1;i<t;i++){
		strcpy(tp.s,map[i][0]);
		strcpy(rp.s,map[i][1]);
		merge(B_search(tp),B_search(rp));
		}
	int bug=0;
	for(i=0;i<n;i++)if(sum[i]%2==1)bug++;
	int root=find(0);
	int flag=1;
	for(i=1;i<n;i++)if(find(i)!=root)flag=0;
	if(flag&&bug<=2&&bug!=1)printf("Possible\n");
	else printf("Impossible\n");
	return 0;
	}


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值