日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

POJ 2186

發(fā)布時(shí)間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2186 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:有n頭牛與m對(duì)關(guān)系,表示A牛仰慕B牛,如果A牛仰慕B牛,B牛仰慕C牛,那么我們可以認(rèn)為A牛仰慕C牛,給出牛的數(shù)量與仰慕關(guān)系,求有多少牛被全部的牛仰慕。

解法:用普通的dfs無(wú)能為力,因?yàn)橛协h(huán)的存在,各種麻煩,于是用求強(qiáng)連通分量的算法,這里我用了kosaraju,將強(qiáng)連通分量求出來(lái)之后,據(jù)fjy的說(shuō)法,不用實(shí)際縮點(diǎn),是要用意念把點(diǎn)縮在一起,每個(gè)顏色只走一次(說(shuō)一下縮點(diǎn),截止2011.11.25為止,我還沒(méi)做縮點(diǎn)),然后翻老程序中又翻出了一個(gè)更神的做法,如果有兩個(gè)或以上顏色點(diǎn)沒(méi)有指向其他顏色點(diǎn)的邊,則說(shuō)明無(wú)解,不然有解(因?yàn)檎f(shuō)明有一些牛沒(méi)有支持另外那部分的牛,只有一個(gè)說(shuō)明全部的牛都指向了這個(gè)點(diǎn)!

{縮點(diǎn)不是真縮,置顏色枚舉一次,kosaraju的拓?fù)湫酝玫膤

?

View Code 1 {usaco popular
2 }
3 const
4 maxn=10000;
5 maxm=50000;
6 type
7 data=record
8 dest, next: longint;
9 end;
10 var
11 edge, idol: array[1..maxm]of data;
12 wmz, stu, col, vect, turn: array[1..maxn]of longint;
13 visit: array[1..maxn]of boolean;
14 ans, p, tot, idt, color, n, m: longint;
15 procedure add(x, y: longint);
16 begin
17 inc(tot);
18 with edge[tot] do
19 begin
20 dest := y;
21 next := vect[x];
22 vect[x] := tot;
23 end;
24 end;
25
26 procedure dda(x, y: longint);
27 begin
28 inc(idt);
29 with idol[idt] do
30 begin
31 dest := y;
32 next := turn[x];
33 turn[x] := idt;
34 end;
35 end;
36
37 procedure init;
38 var
39 i, x, y: longint;
40 begin
41 fillchar(col, sizeof(col), 0);
42 fillchar(vect, sizeof(vect), 0);
43 fillchar(turn, sizeof(turn), 0);
44 fillchar(wmz, sizeof(wmz), 0);
45 tot := 0;
46 idt := 0;
47
48 readln(n, m);
49 for i := 1 to m do
50 begin
51 readln(x, y);
52 add(x, y);
53 dda(y, x);
54 end;
55 end;
56
57 procedure endtime(x: longint);
58 var
59 i: longint;
60 begin
61 visit[x] := true;
62 i := vect[x];
63 while i<>0 do
64 with edge[i] do
65 begin
66 if not visit[dest] then endtime(dest);
67 i := next;
68 end;
69 inc(p);
70 stu[p] := x;
71 end;
72
73 procedure dfs(x: longint);
74 var
75 i: longint;
76 begin
77 col[x] := color;
78 inc(wmz[color]);
79 i := turn[x];
80 while i<>0 do
81 with idol[i] do
82 begin
83 if col[dest]=0 then dfs(dest);
84 i := next;
85 end;
86 end;
87
88 procedure main;
89 var
90 i, j, u: longint;
91 begin
92 p := 0;
93 for i := 1 to n do
94 if not visit[i] then
95 endtime(i);
96 color := 0;
97 for i := n downto 1 do
98 if col[stu[i]]=0 then
99 begin
100 ans := 0;
101 inc(color);
102 dfs(stu[i]);
103 end;
104 fillchar(visit, sizeof(visit), 0);
105 for u := 1 to n do
106 begin
107 i := vect[u];
108 while i<>0 do
109 with edge[i] do
110 begin
111 if col[dest]<>col[u] then
112 visit[col[u]] := true;
113 i := next;
114 end;
115 end;
116 end;
117
118 procedure print;
119 var
120 i, s: longint;
121 begin
122 s := 0;
123 for i := 1 to color do
124 begin
125 if not visit[i] then
126 begin
127 if s=0 then s := i
128 else
129 begin
130 writeln(0);
131 exit;
132 end;
133 end;
134 end;
135 if s<>0 then writeln(wmz[s])
136 else writeln(0);
137 end;
138
139 begin
140 assign(input,'popular.in'); reset(input);
141 assign(output,'popular.out'); rewrite(output);
142
143 init;
144 main;
145 print;
146
147 close(input); close(output);
148 end.



轉(zhuǎn)載于:https://www.cnblogs.com/wmzisfoolish/archive/2012/04/06/2434884.html

總結(jié)

以上是生活随笔為你收集整理的POJ 2186的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。