随笔分类 -  图论

摘要:网络流建模,建模不难,难在找环;#include#include#include#include#include#define inf 1edges; vectorg[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; ... 阅读全文
posted @ 2014-08-01 16:40 Yours1103 阅读(198) 评论(0) 推荐(0)
摘要:前三题特水~~~~第四题,迪杰斯特拉算法。只需在裸的算法改点东西就行#include#include#include#include#define maxn 100005#define inf 1t.d; }};struct Di{ int n,m,ans; vectored; ... 阅读全文
posted @ 2014-07-21 15:19 Yours1103 阅读(150) 评论(0) 推荐(0)
摘要:很简单但很虐心的一道题;我感觉自己的算法没错,但是老是过不了;= =但是还是把代码贴出来;我的方法,用并查集的方式做一课树,然后对树进行遍历;有多少棵树就有多少个点剩余;#include#include#include#define inf 1000000000#define maxn 2009using namespace std;struct node{ int x; int y; int p; int sum; int son[5]; bool operator =4)flag=0; return flag;}void dfs(int root)... 阅读全文
posted @ 2014-03-02 23:07 Yours1103 阅读(272) 评论(0) 推荐(0)
摘要:这是一个非常神奇的题;感觉像一个模拟搜索;但是竟然可以用网络流来解决;直接粘题解把: 如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于:1.哪些雷之间可以相互“跳” ?2.哪些雷可以从右上角“跳”过去,哪些雷可以“跳”到左下角? 第二个问题很好办,如果地雷的范围能接触到最上或者最右的格子,就可以从右上角跳到这个雷上,如果地雷的范围能接触到最下或者最右的格子,就可以跳到左下角。 第一个问题需要分类讨论一下,如果两个雷在同一水平线或者竖直线上,当两个雷的距离不超过 2*K+1 时可以认为两... 阅读全文
posted @ 2013-12-11 22:50 Yours1103 阅读(181) 评论(0) 推荐(0)
摘要:图上的最小的染色方案;学习了陈丹绮的论文: MCS算法#include#define maxn 10005#define maxm 2000005using namespace std;int head[maxn],next[maxm],edge[maxm];int cnt;int d[maxn],f[maxn];void add(int a,int b){ edge[++cnt]=b; next[cnt]=head[a]; head[a]=cnt;}int main(){ int n,m,x,y; scanf("%d%d",&n,&m); while(m- 阅读全文
posted @ 2013-12-04 17:05 Yours1103 阅读(196) 评论(0) 推荐(0)
摘要:spfa+dp;刚刚开始一直想不通怎么判断他是否换了道;后来才知道,将那个时间段打包,找出这段时间内的最短路;真是太奇妙了!#include#include#include#include#define inf 1e6using namespace std;int map[22][22];int pass[22][105];int d[22],inq[22];int n,m,k,e;int dp[22];int spfa(int s,int t){ queueq; for(int i=1; id[u]+map[u][i])) { ... 阅读全文
posted @ 2013-12-03 23:44 Yours1103 阅读(178) 评论(0) 推荐(0)
摘要:最小生成树,然后看他有多少个连通分量,每个连通分量有个飞机场,最后看所有剩下的边是否有大于飞机场的费用,有的话,改成飞机场;比赛的时候一直没想明白,╮(╯▽╰)╭; 1 #include 2 #include 3 #include 4 #define maxn 100009 5 using namespace std; 6 int n,m,a; 7 struct edge 8 { 9 int u,v,w;10 bool operator=a)53 {54 num++;55 ans-=pen[... 阅读全文
posted @ 2013-11-13 23:08 Yours1103 阅读(349) 评论(0) 推荐(0)
摘要:一个很简单的2-sat的题;不过比较难想到;其实也不是很难,可能接触的少了吧! 1 #include 2 #include 3 #define maxn 10009 4 using namespace std; 5 6 struct twosat 7 { 8 int n; 9 vectorg[maxn*2];10 bool mark[maxn*2];11 int s[maxn*2],c;12 13 bool dfs(int x)14 {15 if(mark[x^1])return 0;16 if(mark[x])... 阅读全文
posted @ 2013-11-06 23:02 Yours1103 阅读(188) 评论(0) 推荐(0)
摘要:一个二分图最大匹配的题;匈牙利算法不熟;建了个模,用最小费用最大流解决了 1 #include 2 #include 3 #define INF 9999999 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define maxn 6100 10 11 struct edge 12 { 13 int from,to,cap,flow,cost; 14 }; 15 struct MCMF 16 { 17 int n,m,s,t; 18 vector... 阅读全文
posted @ 2013-11-06 22:18 Yours1103 阅读(197) 评论(0) 推荐(0)
摘要:又是个2-sat的模板题;反正评委的选择必须有一个是正确的,1错误,那么2就必须正确;这就是一个2-sat问题。直接上白书的模板啊,不过稍微要注意的一点是对于第一个点必须要选择,不然就违反了题意;代码: 1 #include 2 #define maxn 2005 3 #define maxm 4005 4 #include 5 #include 6 using namespace std; 7 struct twosat 8 { 9 int n;10 vectorg[maxn*2];11 bool mark[maxn*2];12 int s[maxn*2],c... 阅读全文
posted @ 2013-10-05 19:38 Yours1103 阅读(205) 评论(0) 推荐(0)
摘要:一个最小费用最大流的简单建模题;比赛的时候和小珺合力想到了这个题目的模型;方法:拆点+边的容量为1这样就可以保证他们不会在点上和边上相遇了!感谢刘汝佳大神的模板,让我这个网络流的小白A了这个题。代码: 1 #include 2 #include 3 #include 4 #include 5 #define maxn 42005 6 #define inf 99999 7 using namespace std; 8 9 struct edge 10 { 11 int from ,to,cap,flow,cost; 12 }; 13 14 struct mcmf ... 阅读全文
posted @ 2013-10-05 15:59 Yours1103 阅读(225) 评论(0) 推荐(0)
摘要:Description CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好。现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的数量,每条边的长度。请你求出CX以最短路径赶到教室最多能看到多少学妹。Input 多组输入数据(最多20组),输入到文件结束。 每组数据第一行两个正整数N,M其中N代表点的个数(2 2 #include 3 #include 4 #define maxn 1005 5 #define inf 10000000 6 using namespace std; 7 8 int xuemei[maxn]. 阅读全文
posted @ 2013-10-04 13:18 Yours1103 阅读(333) 评论(0) 推荐(0)
摘要:题目不难,感觉像是一个拓扑排序,要用双端队列来维护;要注意细节,不然WA到死 = =! 1 #include 2 #include 3 #include 4 #define maxn 100005 5 using namespace std; 6 7 int q[2*maxn],count[2][maxn],tail,head,n,m,in[maxn]; 8 vectorve[maxn]; 9 10 int solve(int lab)11 {12 head=tail=n;13 int cnt=0,cc=0,f=lab;14 for(int i=1;i<=n;i++)... 阅读全文
posted @ 2013-10-03 18:01 Yours1103 阅读(255) 评论(0) 推荐(0)
摘要:参考阳神的博客写的,非常好的一个方法。题目的意思是: 对于每对点 找出他们之间所有路径中 最长边 的最小值~~~好拗口的!思路: 直接找出满足要求的太过于麻烦;所以找出不满足条件的,然后用总的数目(n*(n-1))减去不满足的就行;做法: 因为找的是最长边,所以首先将边和查询都按从小到大排好序。因为满足要满足条件,查询的值要比当前已经访问的边的值要大; 另外,访问了边之后要维护,选用并查集!感觉这个方法很正确,但是不会证明 = =!代码: 1 #include 2 #include 3 #define maxn 10005 4 #define maxm 500005 5 using n... 阅读全文
posted @ 2013-09-23 22:28 Yours1103 阅读(290) 评论(0) 推荐(0)
摘要:桥的应用!虽然以前做过强联通分量的题,但刷的很水,所以比赛的时候一直想不起来是桥的应用;反省一下~~~学习一下!思路,找到权值最小的桥;用tarjin算法!代码: 1 #include 2 #include 3 #include 4 #define maxn 1003 5 using namespace std; 6 7 struct edge 8 { 9 int st,ed,w,next;10 }e[maxn*maxn*2];11 12 int head[maxn],dfn[maxn],low[maxn],nncount,best,num,dan;13 14 void addedg... 阅读全文
posted @ 2013-09-16 20:20 Yours1103 阅读(327) 评论(0) 推荐(0)
摘要:一道简单的网络流;这是一道多源多汇的模型;解决的这样的模型的一个方法是:建立一个超级源和一个超级汇,然后就成为了一个模板题了!代码:#include#include#include#define inf 9999999999#define maxn 105using namespace std;int map[maxn][maxn],level[maxn],m,n;bool bfs(){ queueq; memset(level,0,sizeof level); q.push(0); level[0]=1; while(!q.empty()) { ... 阅读全文
posted @ 2013-09-12 20:35 Yours1103 阅读(244) 评论(0) 推荐(0)
摘要:网络流之最大流的基础题;可以使用dinic算法和EK算法:分别对着模板敲了一遍:dinic: 1 #include 2 #include 3 #include 4 #include 5 #define maxn 205 6 #define inf 0xfffffff 7 using namespace std; 8 9 int map[maxn][maxn],level[maxn];10 int n,m;11 12 int bfs(int s)13 {14 memset(level,0,sizeof level);15 queueq;16 q.push(s);17 ... 阅读全文
posted @ 2013-09-12 14:28 Yours1103 阅读(183) 评论(0) 推荐(0)
摘要:二分图,简单的模板题,不过题目比较难懂;其中important chess就是删掉它不能够完美匹配,所以就枚举每一个可能删的棋子;代码: 1 #include 2 #include 3 int map[101][101],v[101]; 4 int match[101],n,m; 5 int dfs(int k) 6 { 7 int i; 8 for(i=0; i<m; i++) 9 {10 if(map[k][i]&&!v[i])11 {12 v[i]=1;13 if(match[i]... 阅读全文
posted @ 2013-09-11 20:05 Yours1103 阅读(141) 评论(0) 推荐(0)
摘要:二分图的水题,第一次写;基本上是参考的 = = !代码: 1 #include 2 #include 3 #include 4 #define maxn 2005 5 using namespace std; 6 7 vectorve[maxn]; 8 int match[maxn]; 9 bool v[maxn];10 11 int dfs(int x)12 {13 int l=ve[x].size();14 for(int i=0; i<l; i++)15 {16 int k=ve[x][i];17 if(!v[k])18 ... 阅读全文
posted @ 2013-09-10 17:34 Yours1103 阅读(131) 评论(0) 推荐(0)
摘要:刚刚看到这个题感觉挺复杂的~~~因为它还要输出字典序;很容易知道对于任意的k,第一个输出总是1 2 #include 3 using namespace std; 4 int a[1=n;i--) printf("%d",a[i]);33 puts("");34 }35 return 0;36 }View Code 阅读全文
posted @ 2013-09-10 16:10 Yours1103 阅读(290) 评论(0) 推荐(0)