bzoj1098 1301

这两题很类似,都是在补图上搜索

但是由于补图太大我们不能建出来

考虑先从一个点搜,每次搜可以搜的点,

然后维护一个链表,记录当前还没有搜过的点,搜过之后从链表中删除即可

  1 type node=record
  2        po,next:longint;
  3      end;
  4
  5 var e:array[0..4000010] of node;
  6     l:array[0..100010] of node;
  7     p,q,ans:array[0..100010] of longint;
  8     can,v:array[0..100010] of boolean;
  9     s,i,n,m,len,x,y:longint;
 10
 11 procedure add(x,y:longint);
 12   begin
 13     inc(len);
 14     e[len].po:=y;
 15     e[len].next:=p[x];
 16     p[x]:=len;
 17   end;
 18
 19 procedure swap(var a,b:longint);
 20   var c:longint;
 21   begin
 22     c:=a;
 23     a:=b;
 24     b:=c;
 25   end;
 26
 27 procedure sort(l,r:longint);
 28   var i,j,x:longint;
 29   begin
 30     i:=l;
 31     j:=r;
 32     x:=ans[(l+r) shr 1];
 33     repeat
 34       while ans[i]<x do inc(i);
 35       while x<ans[j] do dec(j);
 36       if not(i>j) then
 37       begin
 38         swap(ans[i],ans[j]);
 39         inc(i);
 40         dec(j);
 41       end;
 42     until i>j;
 43     if l<j then sort(l,j);
 44     if i<r then sort(i,r);
 45   end;
 46
 47 procedure del(i:longint);
 48   begin
 49     l[l[i].po].next:=l[i].next;
 50     if l[i].next<>-1 then l[l[i].next].po:=l[i].po;
 51   end;
 52
 53 procedure bfs;
 54   var f,r,i,t:longint;
 55   begin
 56     while l[0].next<>-1 do
 57     begin
 58       f:=1;
 59       r:=1;
 60       v[l[0].next]:=true;
 61       q[1]:=l[0].next;
 62       del(l[0].next);
 63       t:=1;
 64       while f<=r do
 65       begin
 66         x:=q[f];
 67         i:=p[x];
 68         while i<>0 do
 69         begin
 70           can[e[i].po]:=true;
 71           i:=e[i].next;
 72         end;
 73         i:=l[0].next;
 74         while i>-1 do
 75         begin
 76           if not v[i] and not can[i] then
 77           begin
 78             inc(r);
 79             q[r]:=i;
 80             del(i);
 81             inc(t);
 82             v[i]:=true;
 83           end;
 84           i:=l[i].next;
 85         end;
 86         i:=p[x];
 87         while i<>0 do
 88         begin
 89           can[e[i].po]:=false;
 90           i:=e[i].next;
 91         end;
 92         inc(f);
 93       end;
 94       inc(s);
 95       ans[s]:=t;
 96     end;
 97   end;
 98
 99 begin
100   readln(n,m);
101   for i:=1 to m do
102   begin
103     readln(x,y);
104     add(x,y);
105     add(y,x);
106   end;
107   for i:=1 to n do
108   begin
109     l[i].po:=i-1;
110     l[i-1].next:=i;
111   end;
112   l[n].next:=-1;
113   bfs;
114   sort(1,s);
115   writeln(s);
116   for i:=1 to s do
117     write(ans[i],‘ ‘);
118   writeln;
119 end.

1098

 1 type node=record
 2        po,next:longint;
 3      end;
 4
 5 var e:array[0..2000010] of node;
 6     l:array[0..100010] of node;
 7     p:array[0..100010] of longint;
 8     can:array[0..100010] of boolean;
 9     i,n,m,x,y,len:longint;
10
11 procedure add(x,y:longint);
12   begin
13     inc(len);
14     e[len].po:=y;
15     e[len].next:=p[x];
16     p[x]:=len;
17   end;
18
19 procedure del(i:longint);
20   begin
21     l[l[i].po].next:=l[i].next;
22     if l[i].next<>-1 then l[l[i].next].po:=l[i].po;
23   end;
24
25 procedure dfs(x:longint);
26   var i,j:longint;
27   begin
28     writeln(x);
29     del(x);
30     i:=p[x];
31     while i<>0 do
32     begin
33       can[e[i].po]:=true;
34       i:=e[i].next;
35     end;
36     i:=l[0].next;
37     while i>-1 do
38     begin
39       if not can[i] then
40       begin
41         j:=p[x];
42         while j<>0 do
43         begin
44           can[e[j].po]:=false;
45           j:=e[j].next;
46         end;
47         dfs(i);
48         exit;
49       end;
50       i:=l[i].next;
51     end;
52   end;
53
54 begin
55   readln(n,m);
56   for i:=1 to m do
57   begin
58     readln(x,y);
59     add(x,y);
60     add(y,x);
61   end;
62   for i:=1 to n do
63   begin
64     l[i-1].next:=i;
65     l[i].po:=i-1;
66   end;
67   l[n].next:=-1;
68   dfs(1);
69 end.

1301

时间: 2024-11-07 13:32:41

bzoj1098 1301的相关文章

Hdu 1301 Jungle Roads (最小生成树)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1301 很明显,这是一道“赤裸裸”的最小生成树的问题: 我这里采用了Kruskal算法,当然用Prim算法也一样可以解题. #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; typedef struct node{ int f

hdu 1301 Jungle Roads

链接:hdu 1301 题意:n个村庄,已知n-1村庄分别到其他村庄修路的费用,求是n个村庄连通的最小费用 分析:这个是最小生成树的题,只不过村庄的编号为A-Z的大写字母,操作比较麻烦,可以将其对应转化为1-26, 这样就与普通的最小生成树题一样了 #include<cstdio> #include<algorithm> using namespace std; int f[50],n,m; struct stu { int a,b,c; }t[300]; int cmp(stru

HDOJ 1301 Jungle Roads

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 //HDOJ1301 #include<iostream>#include<cstring> using namespace std; #define MAX 99999 #define LEN 30 int dist[LEN];//某点的权值 起始点到目标点的权值 int map[LEN][LEN];//某点到某点两点之间的权值 bool isvisitd[LEN];//表示某

[CODEVS 1301] 任务分配

描述 有N位工作人员,同时有N项任务, 每人必须承担一项任务,若给出某人不能从事的某些任务, 问要安排好工作,共有多少种方案? http://codevs.cn/problem/1301/ 分析 容斥原理的应用. 先看看样例: 四个人: A, B, C, D A 不能选择: 2 B 不能选择: 2 3 C 不能选择: 3 4 D 不能选择: 4 总数是1~4全排列的个数 => 4! = 24 再考虑不能选的情况 那么 => 采用 总数-非法个数 的方法计算, 而后者需用容斥原理计算. answ

hdu 1301 Jungle Roads (基础最小生成树)

题目: 链接:点击打开链接 题意: 对n个村庄之间的路进行修理, 然后是n-1行,每行的第一组数据时一个大写字母VIL和一个数K,Vil表示从这个村庄出发,K表示刚才的那个字母代表的村庄和其他村庄的路的数目,接下来在同一行是K组数据,每组是一个大写字母和一个数,大写字母表示和第一个村庄连接的村庄,数表示维修他们之间的路所需的费用.现在为了使维修费油最低,只需所维修的路使每个村庄都是直接或间接的连接即可,求最小的费用. 思路: 只需把输入数据处理好即可.其他都是kruskal模板.' 代码: #i

HDU 1301 &amp;POJ 1215 Jungle Roads【最小生成树,Prime算法+Kruskal算法】

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6737    Accepted Submission(s): 4893 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst o

hdu 1301 Jungle Roads 最小生成树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly,

hihocoder #1301 : 筑地市场 数位dp+二分

题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef long long LL; const LL INFLL = 0x3f3f3f3f3f3f3f3fLL; //dp[x][0]表示高位还没有出

hdu 1301 最小生成树prim实现

http://acm.hdu.edu.cn/showproblem.php?pid=1301 Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4145    Accepted Submission(s): 3020 Problem Description The Head Elder of the tropica