poj1904 King's Quest
2011-10-18 23:45
295 查看
这题时间太卡了,我不知为什么竟然跑了9000+ms 。
这题刚看时很容易想到二分图,但是仔细一看,他已经给你完备匹配了,所以思路应该往别的方面去想。
他要解决的是最多可能与哪几个人中的一个结婚。有的虽然你有意向,但是她已经是别人的了,就不能纳入你想结婚的人选行列。
他给了你完备匹配,也就是说,不管怎样这个人肯定是你的喜欢人选。如果把这个姑娘和你连边,那么就在你和这个姑娘之间存在回路(是联通的)了。既然存在回路可以是想结婚中的人选。那么推广到整个图,也是一样的道理。所以这题要你解决的是联通性问题。
View Code
这题刚看时很容易想到二分图,但是仔细一看,他已经给你完备匹配了,所以思路应该往别的方面去想。
他要解决的是最多可能与哪几个人中的一个结婚。有的虽然你有意向,但是她已经是别人的了,就不能纳入你想结婚的人选行列。
他给了你完备匹配,也就是说,不管怎样这个人肯定是你的喜欢人选。如果把这个姑娘和你连边,那么就在你和这个姑娘之间存在回路(是联通的)了。既然存在回路可以是想结婚中的人选。那么推广到整个图,也是一样的道理。所以这题要你解决的是联通性问题。
View Code
#include"stdio.h" #include"math.h" #include"string.h" #include"stdlib.h" #define maxn 8005 typedef struct node { int girl; int next; }Node; Node map[300009]; bool visit[maxn]; int ret, n, h[maxn], stack[maxn], top; int low[maxn], dfn[maxn], edgecount, f[maxn]; void Insert(int from, int to) { map[ret].girl = to; map[ret].next = h[from]; h[from] = ret++; } void Init() { int i, j, u, v, num; ret = 1; top = 0; edgecount = 1; for (i=1; i<=n; i++) { scanf("%d", &num); for (j=1; j<=num; j++) { scanf("%d", &v); Insert(i, v+n); } } for (i=1; i<=n; i++) { scanf("%d", &v); Insert(v+n, i); } return; } void Dfs(int now, int &deep) { int v, i; stack[++top] = now; dfn[now] = low[now] = deep++; visit[now] = true; for (i = h[now]; i!= 0; i = map[i].next) { v = map[i].girl; if (dfn[v] == 0) { Dfs(v, deep); if (low[now] > low[v]) low[now] = low[v]; } else if (visit[v]) { if (low[now] > low[v]) low[now] = low[v]; } } if (low[now] == dfn[now]) { while (top>0 && now != stack[top]) { f[stack[top]] = edgecount; visit[stack[top]] = false; top--; } f[now] = edgecount; visit[now] = false; top--; edgecount++; } return; } int cmp(const void *a, const void *b) { return *((int *)a) > *((int *)b)? 1:-1; } void Funs() { int i, j, queue[maxn], maxcount, v, deep = 1; for (i=1; i<=n; i++) { if (dfn[i] == 0) Dfs(i, deep); } for (i=1; i<=n; i++) { maxcount = 0; for (j=h[i]; j!= 0; j = map[j].next) { v = map[j].girl; if (f[i] == f[v]) { maxcount++; queue[maxcount] = v - n; } } qsort(queue+1, maxcount, sizeof(queue[0]), cmp); printf("%d ", maxcount); for (j=1; j<maxcount; j++)printf("%d ", queue[j]); printf("%d\n", queue[maxcount]); } return; } int main() { scanf("%d", &n); Init(); Funs(); return 0; }
相关文章推荐
- POJ1904 King's Quest(完备匹配可行边:强连通分量)
- POJ1904 King's Quest(Tarjan 求缩点)
- pku 1904 King's Quest tarjan求强连通分量
- poj 1904 King's Quest 强连通
- poj--1904--King's Quest(scc建图)
- ZOJ2470 POJ1904 King's Quest,强连通分量
- King's Quest
- POJ 1904 King's Quest【强连通分量】
- POJ 1904 King's Quest
- poj1904 King's Quest 强连通分量
- poj 1904 King's Quest
- POJ-1904-King's Quest(强连通图)
- poj 1904 King's Quest tarjan求二分图的所有可选最大匹配边
- UVALive-2966 King's Quest(强连通+二分图匹配)
- Poj 1904 King's Quest 强连通分量
- hdu 5642 King's Order
- poj1904(二分图最优匹配)
- POJ1904(King's Quest)
- poj 1904 King's Quest 强连通
- King's Quest —— POJ1904(ZOJ2470)Tarjan缩点