暑假考试题4:星际旅行(欧拉路)

题目:

分析:

题目大意:从任意点出发,任意点结束,在经过所有边的情况下选择两条边只经过一次,其它都经过两次。

先不考虑自环:这道题看起来很像欧拉路,但欧拉路是每条边只经过一次,那么我们考虑:把边数翻倍,选择两条边删去,使得剩下的是一个欧拉路。

边数翻倍后,每一个点的度数都是偶数

欧拉路的判定:只有两个点是奇数点,其它都是偶数点(奇偶指度数)证明

找不同的两条边删去,再考虑自环的因素,就应该分类讨论:

1.删两条边:通过画图推出,删的两条边一定是连在同一个点上,因为只有这样才会出现两个奇数点。

2.删一个自环和一条边:删掉一个自环后,那个点的度数仍旧是偶数,随便删掉一条边,会产生两个奇数点,所以显然每个自环都可以和另外所以的边搭配。

3.删两个自环:删掉后,剩下所有点仍是偶数点,所以是一条欧拉回路,也满足条件(两个自环走一次,其它走两次)。

但是可能出现有不连通的情况,所以应该用并查集特判一下,不满足则输出0。

注意:像这种数据:一个连通块+一个孤点,也是满足的。所以说并查集不能对点做,而应该对边做,换句话说,这里的连通指的是边的连通!!!

那么怎么对边做并查集呢?

还是先输入点,然后把点并在一起。在判断的时候,只对有连边的点判断是否在一个并查集了,对于没有边的点不用管。

复杂度:O(N)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 100005
int fa[N],a[N],b[N];
ll ans=0,self=0,du[N];
int find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
int main()
{
    freopen("tour.in","r",stdin);
    freopen("tour.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a[i],&b[i]);
        if(a[i]==b[i]) self++;
        else{
            int f1=find(a[i]),f2=find(b[i]);
            fa[f1]=f2;
            du[a[i]]++; du[b[i]]++;
        }
    }
    int f=find(a[1]);
    for(int i=2;i<=m;i++) if(find(a[i])!=f) { printf("0\n"); return 0; }//对边做并查集
    for(int i=1;i<=n;i++)
    if(du[i]>1) ans+=du[i]*(du[i]-1)/2;//C(n,2)累加答案
    if(self&&self!=1) ans+=self*(self-1)/2;//特判一下 以免运行时错误
    ans+=self*(m-self);
    printf("%lld\n",ans);
    return 0;
}
/*
5 4
1 2
1 3
1 4
1 5

10 10
2 4
4 4
4 6
6 6
6 7
7 5
5 8
8 4
4 9
9 10
*/

原文地址:https://www.cnblogs.com/mowanying/p/11408980.html

时间: 2024-10-10 10:26:21

暑假考试题4:星际旅行(欧拉路)的相关文章

HDU5883 The Best Path(并查集+欧拉路)

题意: n个点m条边,问m条边构成的是否为欧拉路. 是的话输出路径上所有点的异或和,每个点经过几次异或几次. 思路: 先用并查集判断是否连通,然后如果是欧拉路的话有两种情况 如果奇数度节点有2个,就枚举这两个点做起点,选大的 如果都为偶数度节点,就枚举n个起点,选大的 /* *********************************************** Author :devil ************************************************ *

CCF 201512-4 送货 (并查集+DFS,欧拉路)

问题描述 为了增加公司收入,F公司新开设了物流业务.由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道.然而,F公司现在只安排了小明一个人负责所有街道的服务. 任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案.城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的 首尾都正好连接着一个交叉路口.除开街道的首尾端点,街道不会在其他位置与其他街道相交.每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一 条或两

欧拉路

欧拉路径和欧拉回路欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径.欧拉回路:在欧拉路径的基础上又回到起点.a.凡是由偶点组成的连通图,一定可以一笔画成.画时可以把任一偶点为起点,最后一定能以这个点为 终点画完此图. b.凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成.画时必须把一个奇点为起点,另 一个奇点终点. c.其他情况的图都不能一笔画出.(有偶数个奇点除以2便可算出此图需几笔画成.) 欧拉回路和欧拉路径的判断欧拉回路:无向图:每个顶点的度数都是偶数,则存在欧拉回路.有向

图的路径:欧拉路(欧拉回路)

欧拉路的相关概念: 1.能从无向图中的一个顶点出发,并走出一条道路,每条边恰好经过一次,这样的路线就叫做欧拉路: 2.找欧拉路首先要判断是否存在欧拉路: 一个无向图存在欧拉路当且仅当该图是连通的,且有且只有0或2个点的度数是奇数,为2时这两个点只能作为欧拉路径的起点和终点(0个时称为欧拉回路). 3.确定存在欧拉路之后,开始构造欧拉路: 欧拉路参考:http://blog.csdn.net/shahdza/article/details/6630108 等做完题,再来补充.

POJ 2513--Colored Sticks【字典树编号 &amp;&amp; 并查集判连通 &amp;&amp; 欧拉路】

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 32351   Accepted: 8536 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

poj 1386 Play on Words(有向图欧拉路+并查集)

题目链接:http://poj.org/problem?id=1386 思路分析:该问题要求判断单词是否能连接成一条直线,转换为图论问题:将单词的首字母和尾字母看做一个点,每个单词描述了一条从首字母指向尾字母的有向边, 则则所有的单词构成了一个有向图,问题变为判断该有向图中是否存在一条欧拉路:有向图中存在欧拉路的两个充分必要条件为:该图是联通的并且所有的点的入度等于出度或者只存在两个点的入度与出度不等,一个点的入度=出度+1,另一个点的入度=出度-1: 代码如下: #include <cstdi

hihoCoder #1176 : 欧拉路&#183;一 (简单)

题意:给出n个岛,每个岛都有桥到达其他岛,且桥数可多可少(即使两岛有多桥),判断是否是欧拉路(即每条桥只能走一次,所有桥都能遍历1遍). 思路: 满足如下条件之一者即为欧拉路: 1.连通图,每个岛的度数为偶数. 2.连通图,其中两个岛的度比为奇数. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=10005; 4 vector< vector<int> > vect; 5 bool vis[

hihoCoder #1181: 欧拉路&#183;二 (麻烦)

题意:提供一个图,要求找出欧拉路的路径(任意合法的路径均可,保证图肯定有欧拉路). 思路:深搜的过程中删除遍历过的边,并在回溯时打印出来.在深搜时会形成多个环路,每个环都有一个或多个结点与其他环相扣,这样就可以产生欧拉路. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1005; 4 int n, m, a, b; 5 vector< vector<int> > vect;//邻接表 6

Codeforces 789D Weird journey - 欧拉路 - 图论

Little boy Igor wants to become a traveller. At first, he decided to visit all the cities of his motherland — Uzhlyandia. It is widely known that Uzhlyandia has n cities connected with m bidirectional roads. Also, there are no two roads in the countr