图论
文章平均质量分 78
飞上天空的鱼
这个作者很懒,什么都没留下…
展开
-
最小生成树-prim
算法模型: 由任意一个顶点开始 ,将此顶点存入S集, 剩余顶点存入T集合每次遍历顶点, 取一条能够连接S与T最短边e, 直到所有顶点全部加入S#include#include#define INF 1int n,m,vis[110],low[110];int map[110][110];int init(){ for(int原创 2014-09-04 11:21:35 · 851 阅读 · 0 评论 -
HDU-1325-Is It A Tree?
/* 可以用并查集来解决这个问题,给出一些边判断是不是一个棵树, 只需要判断只有一个跟节点并且每个点的度不大于1就行、这个题刚开始RE了几次 一直没找到原因,最后才发现 只要2个数都小于0就终止,我以为是-1,-1 结果RE*/#include#include#define M 100010int p[M],vis[M],deg[M];int init()原创 2013-04-15 19:03:44 · 820 阅读 · 0 评论 -
hdu 1233 最小生成树
/*简单的最小生成树*/#include#include#define INF 1int map[1001][1001],vis[1001],low[1001];int n,m;int prim(){ int ans=0; for(int i = 1; i { vis[i] = 0; low[i] =原创 2013-04-15 22:27:37 · 489 阅读 · 0 评论 -
hdu 1102 -Constructing Roads(最小生成树)
/* 基本的最小生成树问题 将已经存在的边重新建图权值为0,再prim就可以 这个题用prim来做还是比较简单的*/#include#include#define INF 1000+10int map[110][110],vis[110],low[110];int prim(int n){ int ans=0; for(int i = 0;原创 2013-04-15 21:29:26 · 606 阅读 · 0 评论 -
hdu 1856 More is better
/* 题意: n组边,问这些边所组成的一个连通图 里面最多可以有多少节点, 可以用并查集建图,d[x]存储节点个数*/#include#include#include#define M 10000001using namespace std;int p[M],d[M];int find(int x){ return x==p[x]?x:p[x]=fin原创 2013-04-15 20:05:23 · 632 阅读 · 0 评论 -
hdu 1272 小希的迷宫(并查集)
/*并查集问题,判断是否连通 并且没有环 若果2个点的根节点相同的话说明会成环,想象一下就知道了*/#include#include#define M 100010int p[M],vis[M],deg[M];int init(){ for(int i = 0; i p[i] = i; memset(vis,0,si原创 2013-04-15 19:25:30 · 635 阅读 · 0 评论 -
图论500题
=============================以下是最小生成树+并查集======================================【HDU】1213 How Many Tables基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree?基础并查集★1856 More is better基础并转载 2013-04-14 21:40:27 · 1473 阅读 · 0 评论 -
hdu 3367 Pseudoforest(最大生成树)
/* 可以说是一个最大生成树的问题吧, 题意:求出一个最大的子图(子图的每个连通分量最多有一个环) 用kruskal算法求出最大生成树 不过要判断是否有环 2树合并时 :若2个子树都有环不能合并 只有一个有环可以合并 但合并后的树有环 若2个子树都没环直接合并*/#include#include#includeusing namespace std;原创 2013-04-22 15:11:06 · 1284 阅读 · 0 评论 -
UVA 10600 - ACM Contest and Blackout (次小生成树)
/* 次小生成树的问题, 方法:求出最小生成树 并且标记路径 F[i][j] 代表最小生成树中i->j中最大的一条边 如果map(i,j)> F[i][j]则替换这条边 枚举每一条不在最小生成树中的边 替换之 找出最小的。*/#include#include#define INF 1int map[110][110],n,m;int vis[110]原创 2013-04-11 14:45:46 · 986 阅读 · 0 评论 -
SGU 103. Traffic Lights(最短路)
/* 一个最短路问题, 不过附加了额外的条件 需要判断这条路等多久才可以通行。*/#include#include#include#include#define INF 1using namespace std;struct Edge{ int from,to,dist;};struct Node{ int u,c原创 2013-04-08 00:11:33 · 648 阅读 · 0 评论 -
10246 - Asterix and Obelix
/* 枚举每一个城市作为宴会地点 然后构图 图中不能有比这个城市价格更高的点、*/#include#include#include#include#define INF 1using namespace std;int c,r,q;int val[100],cost[100],dp[100][100];struct Edge{ i原创 2013-03-21 21:34:37 · 737 阅读 · 0 评论 -
hdu 1811-Rank of Tetris(并查集+拓扑排序)
/* 并查集处理=,然后拓扑排序 当队中超过1个元素时是条件不足,若没有用完所给的条件则是出现冲突*/#include#include#include#includeusing namespace std;int u[10010],v[10010],p[10010],deg[10010];char opr[10010];vector G[10010];原创 2013-04-15 15:56:27 · 766 阅读 · 0 评论 -
hdu 1232 畅通工程(并查集orMST)
/* 题意 连接所有点需要多少边 (已经存在了m条边)两种做法 1:并查集,计算连接了几条边, 总边数为n-1, 答案为n-1-res2: 最小生成树 已有的边权值为0,不存在的为1*///code 1:#include#includeint p[1100],d[1100],vis[1100],map[1001][1001];int n,m,res原创 2013-04-15 22:08:39 · 784 阅读 · 0 评论 -
hdu 1879 继续畅通工程 最小生成树
/* 最小生成树 水题*/#include#include#include#define INF 1int n,m,vis[110];int low[110];int map[110][110];int init(){ for(int i = 1; i for(int j = 1; j map原创 2013-04-16 14:07:55 · 589 阅读 · 0 评论 -
POJ 1456 Supermarket
/*贪心的题目 用并查集优化 取d左边最近的一点为根节点*/#include#include#includestruct S{ int p,d;} a[10010];int p[10010];int find(int x){ return x==p[x]?x:p[x]=find(p[x]);}int cmp(const void *a,const void原创 2013-04-20 21:43:54 · 780 阅读 · 0 评论 -
3938 Portal(离线型的并查集)
/* 题意: 给出一个L 找出有多少条路径符合条件(条件为路径中路的最大值《=L) 做了这个题学到了离线这个概念 离线就是 输入完成后进行操作 在线是变输入边操作 用并查集来构图 , 每当遇到2棵树合并时, num[x]*num[y]是新的路径数*/#include#include#include#includeusing namespa原创 2013-04-18 21:53:44 · 985 阅读 · 0 评论 -
hdu 3926 Hand in Hand(同构图)
/* 判断2个图是否为同构图 只需要判断 图中存在的环跟链的个数是否相同, 环中链中元素个数是否相同运用并查集可以做*/#include#include#include#include#define maxn 10001using namespace std;struct R{ int num,flag;} r1[maxn],r2原创 2013-04-18 17:45:32 · 798 阅读 · 0 评论 -
hdu 1598 find the most comfortable road(枚举+并查集)
/* 用到了贪心的思路,将边排序 在进行枚举 运用并查集就可以判断是否连通 找出最小值*/#include#include#include#define INF 1int n,m,p[1002];struct R{ int x,y,w;} a[1003];int cmp(const void *x,const void *y)原创 2013-04-17 21:09:33 · 714 阅读 · 0 评论 -
hdu 1162 Eddy's picture(最小生成树)
/*水、模板题*/#include#include#include#define INF 1double map[130][130],low[130],a[110],b[110];int vis[130];int n;double dis(int i,int j){ return sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b原创 2013-04-16 18:47:35 · 639 阅读 · 0 评论 -
hdu 1198 Farm Irrigation(搜索+并查集)
/* 这个题我是用搜索过的 本来是想用并查集做,但是始终WA不得正解就直接搜索了*/#include#includeint n,m;int dx[]= {0,0,1,-1},dy[]= {1,-1,0,0}; // r l d uchar s[555][555];int p[555],vis[555][555];struct Node{ int原创 2013-04-17 13:08:24 · 733 阅读 · 0 评论 -
hdu 1863(最小生成树)
/* 基础的最小生成树问题, 不过 要特判条件不足的情况*/#include#include#define INF 1int n,m,vis[110],low[110];int map[110][110];int init(){ for(int i = 1; i for(int j = 1; j map[i][j] = I原创 2013-04-16 10:40:37 · 587 阅读 · 0 评论 -
hdu 1301 Jungle Roads
/* MST 水题!*/#include#include#define INF 1int map[30][30],low[30],vis[30];int n;int prim(){ int ans=0; for(int i = 0; i low[i] = map[1][i]; vis[1] = 1; f原创 2013-04-16 18:39:33 · 625 阅读 · 0 评论 -
hdu 3371 Connect the Cities(最小生成树)
/* hdu 神坑啊! c++能过g++TLE!!!尼玛*/#include#include#define INF 1int map[510][510],low[510],vis[510];int n,m,k;int init(){ for(int i = 1; i for(int j = 1; j map原创 2013-04-16 18:16:32 · 750 阅读 · 0 评论 -
10967 - The Great Escape
/*最短路的变形问题 特别判断旋转门就可以了*/#include#include#include#include#define INF 1using namespace std;int n,m,vis[110][110],ms,ld,d[10010],mad[110][110];char map[110][110];int dx[]= {1,-1,0,原创 2013-04-03 22:27:35 · 612 阅读 · 0 评论 -
UVA 1423 - Guess(前缀和之差+拓扑排序)
/*首先把题目转化为 连续和转化为前缀和之差 再进行拓扑排序 就能得出正确答案。*/#include#include#define M 110int c[M],G[M][M];int topo[M],t,n,sign;bool dfs(int u){ //printf("%d.",u); c[u] = -1; for(原创 2013-03-09 23:40:12 · 772 阅读 · 0 评论 -
UVA 11374 - Airport Express
最短路的问题 用dijkstra就行。 RE了好久,要注意这是无向图。 #include#include#include#include#include#define maxn 100001using namespace std;struct Edge{ int from,to,dist;} a[11000];struct heapnode原创 2012-11-20 16:08:14 · 498 阅读 · 0 评论 -
125 - Numbering Paths
统计路径数量 用warshall算法就行 即 a[i][j] += a[i][k]*a[k][j];但是要判断环的存在 a[k][k] !=0 代表有环 只要经过K点 则路径数就不确定 设为-1;#include#includeint a[100][100];int main(){ int count = 0,n,x,y; w原创 2012-11-25 15:22:12 · 325 阅读 · 0 评论 -
UVA 753 - A Plug for UNIX
最大流的模板题 前n个 连接汇点 中间m个连接源点 最后k个为中间路径#include#include#include#include#includeusing namespace std;#define M 2020#define INF 1int n,m,s,t,k,l;int head[M],end[M];int flow[M][M原创 2012-12-07 17:41:20 · 336 阅读 · 0 评论 -
11045 - My T-shirt suits me
最大流的问题 设立一个源点为0 与衣服之间的容量为n/6 一个汇点 与志愿者之间的容量为1 志愿者与衣服之间容量为1图建好了 套上模版就能AC#include#include#includeusing namespace std;#define M 220#define INF 1int n,m,s,t;int flow[M][M],cap[M][M]原创 2012-12-05 22:18:54 · 479 阅读 · 0 评论 -
10330 - Power Transmission
最大流问题 需要设一个超级源 超级会点 结点也有容量 所以建图的时候要注意一下#include#include#includeusing namespace std;#define M 220#define INF 1int n,m,B,D,t;int head[M],end[M];int flow[M][M],cap[M][M],a[M],p[M];原创 2012-12-05 22:16:39 · 497 阅读 · 0 评论 -
10917 - Walk Through the Forest
用dijkstra求出最短路径 每个点i回家的最短路径d[i], 题意 为存在一条从B出发回家的路径 比所有从A出发回家的路径都要短 即d[B]B 可行。 这样可以建立一个新的图 求出起点到终点 的路径条数。用DP可以做。#include#include#include#include#define maxn 10001#define INF 1using n原创 2012-11-20 16:18:30 · 421 阅读 · 0 评论 -
UVA 10806 - Dijkstra, Dijkstra.
这个题 刚开始用了2次spfaWA了 查了下题解发现是网络流的问题 但有人用spfa过了 一直不明白原理 为什么改成负边可以AC 改成INF不能过 求出来的最短路不应该是一样的吗? 求大神指点。#include#include#define maxn 210#define maxe 1010#define INF 1int n,m,edge[max原创 2012-11-20 16:23:10 · 538 阅读 · 0 评论 -
UVA 10986 - Sending email
最短路的模板题 用dijkstra就可以#include#include#include#include#define maxn 100001using namespace std;struct Edge{ int from,to,dist;};struct heapnode{ int d,u; bool operator原创 2012-11-20 16:20:23 · 415 阅读 · 0 评论 -
10803 - Thunder Mountain
求出任意A点到B点 的最大距离 folyd求各点出间的距离#include#include#includedouble x[110],y[110];double d[110][110];double dis(int i,int j){ double l1 = x[i] - x[j]; double l2 = y[i] - y[j];原创 2012-12-02 21:42:03 · 453 阅读 · 0 评论 -
558 - Wormholes
题目大意就是 有一些虫洞可以连通不同的星域 可以通过虫洞回到过去或者到达未来 权值代表可以到达的时间要求判断是否能回到过去 就是找是否又负环存在 用spfa即可#include#includeusing namespace std;#include#include#include#define maxn 6100const int INF = 900原创 2012-11-30 22:00:43 · 358 阅读 · 0 评论 -
hdu 1083
/* 二分图匹配, p门课程n个学生 找出p个学生代表 不能有重复的 这是我对题意的理解也就是X Y 点集一一对应*/#include#includeint p,n; // ke数 点数int g[410][410],vis[410],pr[410];bool SP(int u){ int v; for(v = 1; v原创 2013-02-14 15:51:50 · 288 阅读 · 0 评论 -
二分图最大匹配算法
二分图的最大匹配就是要在二分图的边集E中找到一个子集S,使S中的任两条边没有公共顶点,且|S|达到最大。二分图有很多实际应用,如工作分配问题。同时二分图最大匹配问题又可以转化成“最小顶点覆盖”、“最小路径覆盖”、“最大独立集“等问题,因此显得非常重要。下面就介绍二分图最大匹配算法。二分图最大匹配可以转换成最大流问题来解。假设二分图的两个顶点集分别为X, Y,那么我们在图中添加一个源s,和一转载 2013-02-14 14:58:30 · 916 阅读 · 0 评论 -
二分图最大匹配(匈牙利算法)
二分图最大匹配(匈牙利算法) 这两天自学了一下二分图的最大匹配(匈牙利算法)的算法,现在稍微总结一下。(1)前提说明:(用到的定义说明)1。二部图: 如果图G=(V,E)的顶点集何V可分为两个集合X,Y,且满足 X∪Y = V, X∩Y=Φ,则G称为二部图;图G的边集用E(G)表示,点集用V(G)表示。2。匹配: 设M是E(G)的一个子集,如果转载 2013-02-14 14:38:06 · 624 阅读 · 0 评论 -
10841 - Lift Hopping in the Real World
/*乘坐电梯问题的升级版 要求的是 最差情况下的最短路题意:从0层到k层 求最短路 换一次电梯+5s 但每次乘坐电梯的时候无法确定电梯在哪一层 所以要等一段时间才可以乘坐求出最坏情况下所用的时间 也就是每次乘坐电梯 的时候电梯离你的位置最远。*/#include#include#include#include#include#define INF 1原创 2013-04-03 13:19:39 · 609 阅读 · 0 评论 -
UVA 11280 - Flying to Fredericton
/* 最短路问题, 题意:给出一个q 代表 到达目的地的过程中最多可以停几站。 方法: 用一个dp数组 dp[i][j] 代表第i站的时候停站j次的最小花费。 然后bfs就可以*/#include#include#include#include#include#include#define M 1010us原创 2013-03-19 17:54:54 · 701 阅读 · 0 评论