图论 - 寻找fly真迹

一天fly正坐在课堂上发呆,突然,他注意到了桌面上的一个字符串S1S2S3S4...Sn,这个字符串只由字符"a","b"和"c"构成。刚好这堂课很无聊,所以他决定为这个字符串画一张图,(这张图上的每个点代表字符串中的一个字符,例如节点1代表S1。)这张图有以下特点:

1.它有n个点,从1到n进行标号。
2.对于图上任意的两个点i和j(i?≠?j),当两者代表的字符在字典序顺序上相邻或者相等的时候,会被连上一条边。也就是说,"a"-"b", "a"-"a"这类的,它们间会有一条边相连,而"a"-"c"这类的就没有边相连。

fly根据这个字符串画出了图,随后把原先的字符串擦除了,于是桌面只留下了图。xf听说了fly的光荣事迹,第二天决定去一睹真迹,于是他来到了fly那天所在的教室的那张桌子前,然而眼前的一幕让他惊呆了:桌子上出现了好多幅图,显然这是某个别有用心的同学(GooZy?)私自画上去的。这可急坏了xf,于是他想请你帮他找出哪幅才是fly真迹。

输入

输入包含多组数据。第一行为一个整数T(1?≤?T?≤?100),代表数据组数,对于每组数据: 第一行是两个整数n和m( 1?≤?n?≤?500,?0?≤?m?≤?n(n?−?1)/2 ),分别代表图上点的个数和边的个数。
然后是m行,每行两个整数uivi ( 1?≤?ui,?vi?≤?n,?ui?≠?vi ),代表图上的一条边所连接的两个点。输入保证没有重边。

输出

如果是fly真迹,即这张图是由题目描述中的字符串构成的,则输出“Yes”,否则输出“No”(不包含双引号)。

样例输入

3

2 1
1 2

4 3
1 2
1 3
1 4

4 4
1 2
1 3
1 4
2 3

样例输出

Yes
No
Yes

HINT

对于样例1,fly见到的字符串可能长这个样子:aa, bb, cc...
对于样例2,结点1和其它所有的点相连,但是结点2、3、4互不相连,这说明这三者互不相邻,而我们只有三个字符,不可能存在这样的字符串满足这张图,所以这幅图不是fly的真迹。
对于样例3,我们可以构造这样的字符串“baac”来满足这张图。

------------------------------------------------------我是分割线^_^------------------------------------------------------------

题目大意:一个点可能为a、b、c三个值,字典序相邻的点之间必须有一条边,给出一些点组成的图,判定这个图是否合法。

解题思路:从反面考虑,没有连边的点对,一定是一个为a、一个为c,所以问题就转化成了二分图判定。但是要注意,染色

之后,颜色相同的点之间必须有边,颜色不同的点之间不能有边。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<cctype>
using namespace std;

#define Int __int64
#define INF 0x3f3f3f3f

const int MAXN = 555;
int maze[MAXN][MAXN];
int color[MAXN];
bool ans;

void BFS(int t, int n) {
    queue<int>q;
    while (!q.empty()) q.pop();
    color[t] = 1;
    bool app = true;//用来确定是否还原标记= =,就是少了这一点
    q.push(t);
    while (!q.empty()) {
        int now = q.front();
        q.pop();
        for (int i = 1; i <= n; i++) {
            if (now == i) continue;
            if (!maze[now][i] && color[i] == -1) {
                app = false;
                q.push(i);
                color[i] = !color[now];
            }
            if (!maze[now][i] && color[now] == color[i]) {
                ans = false;
                return ;
            }
        }
    }
    if (app) color[t] = -1;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int cas;
    while (scanf("%d", &cas) != EOF) {
        while (cas--) {
            memset(maze, 0, sizeof(maze));
            memset(color, -1, sizeof(color));
            int n, m;
            scanf("%d %d", &n, &m);
            int u, v;
            for (int i = 0; i < m; i++) {
                scanf("%d %d", &u, &v);
                maze[u][v] = maze[v][u] = 1;
            }
            ans = true;
            for (int i = 1; i <= n; i++) {
                //判断负一,如果该点没有被染色,就开始对其进行染色= =
                if (color[i] == -1) {
                    BFS(i, n);
                }
            }
            for (int i = 1; i <= n; i++) {
                if (!ans) break;
                for (int j = 1; j <= n; j++) {
                    if (i == j || color[i] == -1 || color[j] == -1) continue;//判断条件
                    if (maze[i][j] && color[i] != color[j]) {
                        ans = false;
                        break;
                    }
                    if (!maze[i][j] && color[i] == color[j]) {
                        ans = false;
                        break;
                    }
                }
            }
            if (ans) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}
时间: 2024-08-26 10:38:19

图论 - 寻找fly真迹的相关文章

联合训练图论场

联合训练图论场题解报告 传送门 A.Euler 题意:略 分析: 这题主要是先掌握欧拉通路的概念,然后是如何判断图是否存在欧拉通路. 欧拉通路:通过图中每条边且只通过一次,并且经过每一顶点的通路. 欧拉回路:通过图中每条边且只通过一次,并且经过每一顶点的回路. 无向图: 欧拉通路:连通图+只存在0个或者两个度数为奇数的点. 欧拉回路:连通图+所有节点的度数均为偶数. 有向图: 欧拉通路:连通图+(所有点的入度=出度 || 出两个点之外其他点的入度=出度,一个点的入度-出度=1,一个点的出度-入度

【DFS】【图论】NOIP2014寻找道路

[NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的点都直接或间接与终点连通. 2.在满足条件1的情况下使路径最短. 注意:图G中可能存在重边和自环,题目保证终点没有出边. 请你输出符合条件的路径的长度. 输入描述 Input Description 第一行有两个用一个空格隔开的整数n和m,表示图有n个点和m条边. 接下来的m行每行2个整数x.

NOIp 2014 #3 寻找道路 Label:图论

题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条件1 的情况下使路径最短. 注意:图G 中可能存在重边和自环,题目保证终点没有出边. 请你输出符合条件的路径的长度. 输入输出格式 输入格式: 输入文件名为road .in. 第一行有两个用一个空格隔开的整数n 和m ,表示图有n 个点和m 条边. 接下来的m 行每行2 个整数x .y ,之间用一个

关于图论的若干巴拉巴拉

最近课堂上正在讲图论 先安利MIT课程:http://open.163.com/special/opencourse/algorithms.html 因为本人对图论的概念并不是很清楚,所以还是整理一下吧. 1.图论的基本概念 几种常见的图的分类: 类型 边 允许多重边 允许环 简单图 无向 否 否 多重图 无向 是 否 伪图 无向 是 是 有向图 有向 否 是 有向多重图 有向 是 是 完全图:n个顶点上的完全图是在每对不同顶点之间都恰有一条边的简单图. 二分图:若把简单图G的顶点集合分为两个不

图论及其应用——图

我们探索某个领域的知识,无不怀揣的核弹级的好奇心与求知欲,那么,今天,我们就将开始对图论的探索.   观察一副<机械迷城> 的一处谜题.    不得不承认,<机械迷城>这款解密游戏难度远胜于<纪念碑谷>, 其中一个困难点就在于——<纪念碑谷>的目标是很明确的,但是<机械迷城>往往需要自己凭感觉设立目标.而这里的关卡的目标,就是堵住第三个出水口. 为了解决这个谜题,如果不去考虑用暴力枚举的方法去试探(其实很多情况下都是用到这种情况)一开始,我们似乎

[转] 一些图论、网络流入门题总结、汇总

最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意:经典问题:K短路解法:dijkstra+A*(rec),方法很多相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础)http://ac

【转】一些图论、网络流入门题总结、汇总

最短路问题 此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等) http://acm.pku.edu.cn/JudgeOnline/problem?id=2449 题意:经典问题:K短路 解法:dijkstra+A*(rec),方法很多 相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144 该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础) ht

2017清北学堂集训笔记——图论

我们进入一个新的模块——图论! emmmmm这个专题更出来可能有点慢别介意,原因是要划的图和要给代码加的注释比较多,更重要的就是...这几个晚上我在追剧!!我们的少年时代超级超级超级好看,剧情很燃啊!!咳咳,好吧下面回归正题. 一.图的存储: 1.邻接矩阵: 假设有n个节点,建立一个n×n的矩阵,第i号节点能到达第j号节点就将[i][j]标记为1(有权值标记为权值), 样例如下图: 1 /*无向图,无权值*/ 2 int a[MAXN][MAXN];//邻接矩阵 3 int x,y;//两座城市

图论(二):图的四种最短路径算法

本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法 1),深度或广度优先搜索算法(解决单源最短路径)从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径. 下面是核心代码: void dfs(int cur, int dst){ /***operation***/ /***operation***/ if(minPath < dst) return;//当前走过路