2011年8月27日
摘要: 基础题。注意点在于当模式等于0时的处理。#include<iostream>using namespace std;int n,m,k;const int N=105,M=1005;bool mat[N][N];bool visit[N];int link[N];bool dfs(int u){for(int i=0;i<m;i++)if(!visit[i]&&mat[u][i]){visit[i]=true;if(link[i]==-1||dfs(link[i])){link[i]=u;return true;}}return false;}int main 阅读全文
posted @ 2011-08-27 21:53 不是我干的 阅读(135) 评论(0) 推荐(0)
摘要: 最小点覆盖题目。注意:这里的每个节点可以让多个路径通过。故需要先用floyd处理一遍。#include<iostream>using namespace std;int n,m;const int N=505,M=5005;bool mat[N][N];bool visit[N];int link[N];//int edgehead[N];/*struct{int v;int next;}edge[M];*/void floyd(){for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if( 阅读全文
posted @ 2011-08-27 21:28 不是我干的 阅读(150) 评论(0) 推荐(0)
摘要: 刚开始写错:代码如下(应该有不少人犯和我一样的错误)#include<iostream>using namespace std;int n;const int N=505;bool mat[N][N];bool visit[N];int link[N];bool dfs(int u){for(int i=0;i<n;i++)if(!visit[i]&&mat[u][i]){visit[i]=true;if(link[i]==-1||dfs(link[i])){link[i]=u;return true;}}return false;}int main(){wh 阅读全文
posted @ 2011-08-27 19:57 不是我干的 阅读(158) 评论(0) 推荐(0)
摘要: 本质是最大团的问题。转化成补集的最大独立集的问题。这题的巧妙之处就在此。#include<iostream>using namespace std;const int N=205;int link[N];bool visit[N];bool match[N][N];int g,b,m;bool dfs(int u){for(int i=1;i<=b;i++)if(!visit[i]&&!match[u][i]){visit[i]=true;if(link[i]==-1||dfs(link[i])){link[i]=u;return true;}}return 阅读全文
posted @ 2011-08-27 00:02 不是我干的 阅读(113) 评论(0) 推荐(0)