这道题目调了n久,最后终于攻克了,赞一个图论题目,模板要高度可靠题意抽象:要完成两个任务1:最少从几个点开始遍历就能遍历所有的点,即求缩点后入度为零的点的个数如果不缩点,举个例子:有两个环,没有点入度为0,但是还是需要分别从两个环中的点开始遍历,所以要先缩点2、最少需要连几条边,图就变成强连通了,即把入度为0 和出度为0的点都连起来,相当于把一棵树的叶子和根连起来,最少需要连的边数为出度为0的连通块数的入度为0的连通块数的较大值(应该很容易想的)另外,需要注意一个地方,就是原图可能就是强连通,缩点后就只有一个点了,入度出度均为0,所以要特判一下#include<stdio.h>#i Read More
#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX = 10010;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX];int top,btype,tdfn;//btype:连通块的个数int belong[MAX];//点属于哪个连通块bool ins[MAX];void dfs(int s){ int i,t; dfn Read More
搜索双连通分量。深度优先搜索过程中,用一个栈保存所有经过的节点,判断割点,碰到割点就标记当前栈顶的结点并退栈,直到当前结点停止并标记当前割点。标记过的结点处于同一个双连通分量。交叉染色搜索奇圈。在一个节点大于2的双连通分量中,必定存在一个圈经过该连通分量的所有结点;如果这个圈是奇圈,则该连通分量内的所有的点都满足条件;若这个圈是偶圈,如果包含奇圈,则必定还有一个奇圈经过所有剩下的点。因此一个双连通分量中只要存在一个奇圈,那么该双联通分量内的所有的点都处于一个奇圈中,在题目中,即武士可以坐成一圈。根据这个性质,只需要在一个双联通分量内找奇圈即可判断该双联通分量是否满足条件。交叉染色法就是在dfs Read More
//缩点后必须只有一个点的出度为0,此连通块中的点才被所有的牛仰慕//poj 2186#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX = 10010;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX];int top,btype,tdfn;//btype:连通块的个数int belong[MAX];//点属于哪个连通块 Read More