//图的三连通的判断//在图中删去一个点,判断是否存在割点,以及判断图是否连通#include<stdio.h>#include<string.h>#include<vector>using namespace std;const int MAX = 1010;vector<int> edge[MAX];int low[MAX],dfn[MAX];int vis[MAX];int n,m,tdfn;bool flag=0;int root;inline int min(int a,int b){return a<b?a:b;}void df Read More
这道题目调了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
#include<stdio.h>#include<algorithm>using namespace std;int m,n;int a[105],b[105];int diff,ans;int solve(int x,int y){ int temp; int d=0; temp=(x^y); if(temp&1) d++; while(temp) { if((temp>>1)&1) d++; temp>>=1; } return d;}int main(){ int T;... Read More
建图过程,上面一行字母与下面一行一一对应连边,再利用KM求一个最优匹配即可#include<stdio.h>#include<string.h>#include<string>#include<vector>#include<stdlib.h>using namespace std;#define MIN(a,b) a<b?a:b#define INF 999999#define MAX 50int match[MAX];bool sx[MAX],sy[MAX];int lx[MAX],ly[MAX],map[MAX][MAX] Read More
输出的时候要注意#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<stdlib.h>using namespace std;const double eps = 1e-8;struct point { double x,y;}p[20010];int top;bool cmpxy(point a,point b){ if(fabs(a.y-b.y)>eps) return a.y<b.y; return a.x< Read More
#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>struct point{ int x,y;}p[1000];int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}int onedge(int n,point *p)//多边形边上的网格点数{ int i,ret=0; for(i=0;i<n;i++) ret+=gcd(abs(p[i].x-p[(i+1)%n].x),abs(p[i]. Read More
#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>struct point{ int x,y;}p[1000];int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}int onedge(int n,point *p)//多边形边上的网格点数{ int i,ret=0; for(i=0;i<n;i++) ret+=gcd(abs(p[i].x-p[(i+1)%n].x),abs(p[i]. Read More