图论
灰黑飞
用智慧的程序写出美好的未来。
展开
-
hdu 4857 逆向拓扑排序+逆向输出
逃生Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 341 Accepted Submission(s): 66Problem Description糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道原创 2014-07-21 10:39:27 · 534 阅读 · 0 评论 -
hdu 1151DAG图的最小路径覆盖数
#include#include#define N 150int n,map[N][N],link[N],mark[N];int find(int k){ int i; for(i=1;i<=n;i++) { if(map[k][i]==1&&mark[i]==0) { mark[i]=1; if(link[i]==0||find(link[i])==1)原创 2014-08-14 22:50:08 · 380 阅读 · 0 评论 -
hdu 3395
km()裸题题意: 有 n 条鱼,雄的会攻击他认为是雌的鱼,一条鱼一旦被攻击,就会生下一定数量的孩子,每条鱼只能被攻击一次,问最后最多可以生下多少孩子。分析: 因为每条鱼只能被攻击一次,正好符合二分图的性质,此题只要找出完全匹配下的最优匹配即可。#include#include#define inf 0x3fffffff#define N 200int n,link[N],mar原创 2014-08-14 22:50:31 · 358 阅读 · 0 评论 -
hdu 1533
#include#include#include#define inf 9999999#define N 200int map[N][N],mark[N],s[N],lx[N],ly[N],link[N],n1,n2;char str[N][N];struct node{ int x,y;}a[200],b[200];int max(int a,int b){ retur原创 2014-08-14 22:50:52 · 381 阅读 · 0 评论 -
hdu 1853
#include#include#define inf 999999999#define N 200int map[N][N],mark[N],lx[N],ly[N],link[N],s[N],n;int max(int a,int b){ return a>b?a:b;}int min(int a,int b){ return a<b?a:b;}int find(int原创 2014-08-14 22:51:33 · 307 阅读 · 0 评论 -
hdu 2853
/*题目大意:现在有N个部队和M个任务(M>=N),每个部队完成每个任务有一点的效率,效率越高越好。但是部队已经安排了一定的计划,这时需要我们尽量用最小的变动,使得所有部队效率之和最大。求最小变动的数目和变动后和变动前效率之差。解题思路:比如现在有a边和b边,权值相同,原计划中选择的是a边,但是用km时候,可能选择的就是b边,虽然权值没变,但是变动量已经变了。这就是错误的情况。因为原创 2014-08-14 22:53:24 · 296 阅读 · 0 评论 -
hdu 1507
题目大意:给你一个矩形,然后输入矩形里面池塘的坐标(不能放东西的地方),问可以放的地方中,最多可以放多少块1*2的长方形方块,并输出那些方块的位置。 这道题感觉出得很好,平时经常会遇到这些问题,但是不知道怎么解决。这个问题就是二分匹配,用匈牙利算法可以搞定,问题就是如何建图,相邻连着的就可以加一条边。这样建图后,最大匹配就是最大值。题目有指出 ( (N x M) - K <= 50), 所以最原创 2014-08-14 22:53:27 · 400 阅读 · 0 评论 -
hdu 1281
#include#include#define N 200int map[N][N],link1[N],mark[N],m,link2[N];int find(int u,int p[]){ int i; for(i=1;i<=m;i++) { if(mark[i]==0&&map[u][i]==1) { mark[i]=1; if(p[i]==-1||find原创 2014-08-14 22:54:06 · 278 阅读 · 0 评论 -
hdu 1068
#include#include#define N 1010int map[N][N],link[N],mark[N];int n;int find(int k){ int i; for(i=0;i<n;i++) { if(map[k][i]==1&&mark[i]==0) { mark[i]=1; if(link[i]==0||find(link[i])==原创 2014-08-14 22:56:03 · 365 阅读 · 0 评论 -
hdu 2063
#include#include#define N 600int link[N],mark[N],map[N][N];int n,m;int find(int u)//找增广路{ int i; for(i=1;i<=m;i++) { if(mark[i]==0&&map[u][i]==1) { mark[i]=1; if(link[i]==0||find(li原创 2014-08-14 22:56:05 · 315 阅读 · 0 评论 -
poj 1469
#include#include#define N 600int link[N],map[N][N],mark[N],m;int find(int k){ int i; for(i=1;i<=m;i++) { if(map[k][i]==1&&mark[i]==0) { mark[i]=1; if(link[i]==0||find(link[i])==1)原创 2014-08-14 22:56:59 · 313 阅读 · 0 评论 -
hdu 3335
#include#include#define N 1100__int64 a[N];int map[N][N],mark[N],link[N],n;int find(int k){ int i; for(i=1;i<=n;i++) { if(!mark[i]&&map[k][i]) { mark[i]=1; if(!link[i]||find(link[i]原创 2014-08-14 22:57:03 · 371 阅读 · 0 评论 -
hdu 4619
题意分析: 水平N牌 ,垂直M牌 ,水平相互独立(即不想交) ,垂直也是如此。 可以看出这是一个二分图。 但是水平的牌和垂直的会相交,求最少踢出去几张牌,使得剩下的牌都不相交 。 那么把水平和垂直相交的牌连边,求出最大匹配数,把这些匹配的边切断,剩下的牌就相互不交了。也就是最大独立点。 代码写漂亮点,即使拿不到奖,对找工作有帮助的,同学们。#include#incl原创 2014-08-14 22:57:46 · 403 阅读 · 0 评论 -
hdu 1498
#include#include#includeusing namespace std;#define N 200int mark[N],map[N][N],link[N],n,hash[N],b[N],color[N];int find(int k,int u){ int i; for(i=1;i<=n;i++) { if(!mark[i]&&map[k][i]==u)原创 2014-08-14 23:00:01 · 408 阅读 · 0 评论 -
hdu 1150
#include#include#define N 200int map[N][N],mark[N],link[N],m;int find(int k){ int i; for(i=0;i<m;i++) { if(map[k][i]==1&&mark[i]==0) { mark[i]=1; if(link[i]==0||find(link[i])==1)原创 2014-08-14 23:01:17 · 299 阅读 · 0 评论 -
hdu 2119
#include#include#define N 200int map[N][N],mark[N],link[N],m;int find(int k){ int i; for(i=1;i<=m;i++) { if(!mark[i]&&map[k][i]==1) { mark[i]=1; if(!link[i]||find(link[i])) {原创 2014-08-14 23:02:42 · 352 阅读 · 0 评论 -
poj 3041
#include#include#define N 600int map[N][N],mark[N],link[N],n;int find(int k){ int i; for(i=1;i<=n;i++) { if(map[k][i]==1&&mark[i]==0) { mark[i]=1; if(link[i]==0||find(link[i])==1)原创 2014-08-14 23:03:23 · 299 阅读 · 0 评论 -
hdu 2255 km入门题
#include #include #include #define N 305 #define inf 0x3fffffff int n,map[N][N],lx[N],ly[N],match[N]; bool s[N],t[N];//s[]、t[]为左/右第i个点是否在匈牙利树中int min(int a,int b) { if(a>b)return原创 2014-08-14 23:05:33 · 361 阅读 · 0 评论 -
hdu 1151 最小路径覆盖
#include #include #define N 150 int n,map[N][N],link[N],mark[N]; int find(int k) { int i; for(i=1;i { if(map[k][i]==1&&mark[i]==0) { mark[i原创 2014-08-11 12:19:17 · 382 阅读 · 0 评论