
æè¿ãGeektimesã§ããæ°·ãšçã®æããšããäžé£ã®æžç±ã®è¡šé¢çãªçµ±èšæ
å ±ãæ²èŒã
ãèšäºãå
¬ââéããŸã
ã ã ããããç§ã¯æãè峿·±ãéšåã§ãã瀟äŒé¢ä¿ã®ã°ã©ãã«ã¯å
¥ããŸããã§ããããããã¯ã¯ç¹å¥ãªæ³šç®ã«å€ããããã§ãã ãã®èšäºã§ã¯ãã°ã©ãçè«ããã®ãããªããŒã¿ã®åæã«ã©ã®ããã«åœ¹ç«ã€ãã瀺ãã䜿çšããã¢ã«ãŽãªãºã ã®å®è£
ã説æããŸãã
èå³ã®ããæ¹ãç«ãžããããã
åè¿°ã®èšäºã®èª¿æ»ãããGeektimesã®èŽè¡ã®3åã®1以äžãå°èª¬ã®ãã¡ã³ã¿ãžãŒå°èª¬ã«ç²ŸéããŠããã忰以äžãã·ãªãŒãºã®ããããã«ç²ŸéããŠãããšçµè«ä»ããŸããã GeektimesãšHabrahabrã®èŽè¡ã亀差ãã䜿çšããã¢ã«ãŽãªãºã ã ãã§ãªããçµæã«ãèå³ããããããããªãããšãé¡ã£ãŠããŸãã
ããŒã¿
ãã¡ãããäž»ãªããšããå§ããŸããã-ããŒã¿ã ãœãŒã·ã£ã«ã¢ã¯ãã£ããã£ã®ã°ã©ãããããŸãã
ã°ã©ãã®é ç¹ã«ããç座ã®äžçã®ãã£ã©ã¯ã¿ãŒãæåããŸããé ç¹ã®ãµã€ãºã¯åœŒã話ããèšèã«äŸåããã°ã©ãã®ç«¯ã«ãããã£ã©ã¯ã¿ãŒã®ãã€ã¢ãã°ã§ã¯ãrib骚ã®åããäŒè©±ã®æ°ã«äŸåããŸãã
ã°ã©ãã«é¢ããäžè¬æ
å ±ïŒã°ã©ãã¯éæåã§ãã
é ç¹ïŒèªã¿åãæåïŒïŒ1105
ãªãïŒãã€ã¢ãã°ãèªãïŒïŒ3505
ããã¯ãã¹ãŠè¯ãã§ããããã¹ãŠã®äŒè©±ã®ãªã¹ããäœæãããã®æå±ã決å®ãã人ã§ãããç§ã«å°ããŸãïŒ5åã®æ¬ã«ã¯çŽ
200äžèªããããŸã ïŒã
æ¡ä»¶ä»ãã©ã³ãã ãã£ãŒã«ãã¡ãœãã ãçããŸãã ã¯ããæ©æ¢°åŠç¿ã䜿çšããŠããŒã¿ãåéããŸãããã¢ãã«ã®ããã¬ãŒããŒããè¿°ã¹ãŠããããã«ãäŒè©±ã®æå±ã決å®ãã粟床ã¯
çŽ75ïŒ
ã§ãã èšäºã®æåŸã«ã¢ã³ã±ãŒãã远å ããŠãæ¡ä»¶ä»ãã©ã³ãã ãã£ãŒã«ãã¡ãœããã®é©ç𿹿³ã«ã€ããŠãã®èšäºã翻蚳ãããã©ããã確èªããŸãã
ãããã£ãŠããã¹ãŠã®ã¢ã«ãŽãªãºã ã®å
¥åããŒã¿åœ¢åŒã¯åãã«ãªããŸããæåã®è¡ã«ã¯ãã°ã©ãã®é ç¹ãšãšããžã®æ°ã§ãã
Vãš
Eãããããå«ãŸããŠããŸãã
次ã¯ããã£ã©ã¯ã¿ãŒ
IDãšåœŒã®ååãå«ã
Vè¡ã§ãã ãã®åŸã
uvw圢åŒã®
Eè¡ã¯ãšããžã®èª¬æã§ãã
uãš
vã®éã«ãéã¿
wã®ãšããžãããããšãæå³ã
ãŸã ãããã§ã
uãš
vã¯æå
IDã§ãã éã¿ãšã¯ãããããã®ãã£ã©ã¯ã¿ãŒéã®å¯Ÿè©±ã®æ°ãæå³ããããšãæãåºãããŠãã ããã é ç¹èªäœã®éã¿ã¯ã©ãã«ãèæ
®ãããŸããã 圌ã«ãµããããã¢ããªã±ãŒã·ã§ã³ãèŠã€ããããŸããã§ããã ãããããã¢ã«ãŽãªãºã ã³ãŒãã¯C ++ã§è¡šç€ºãããŸãã
ãã¡ãããããŒã¿ãèªã¿åãå¿
èŠããããŸãã ãã®ããã
definitions.hãã¡ã€ã«ãš
definitions.cppãã¡ã€ã«ãäœæããŸããã ããã«ãã³ãŒããå°ãªããªããã³ãŒããèªã¿ããããªãããã«ãåžžã«
definitions.hãæ¥ç¶ããŸãã åŸç¶ã®åã¢ã«ãŽãªãºã ã¯åå¥ã®é¢æ°ãšããŠå®è£
ããã
ã¡ã€ã³é¢æ°ã§åŒã³åºãããŸãã
defenitions.h#ifndef DEF_H #define DEF_H #define _CRT_SECURE_NO_DEPRECATE #include <cstdio> #include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> #include <queue> #include <set> #include <iterator> #include <functional> using namespace std; extern int reverseID[]; extern vector<int> id; extern vector< vector<int> > weight, edge; extern map<int, string> name; extern int V, E; void read_data(); #endif
definition.cpp #include "definitions.h" int reverseID[3000]; vector<int> id; // origin ID of characters vector< vector<int> > weight; // weights of edges vector< vector<int> > edge; // the graph's edges map<int, string> name; // names of characters int V, E; // amount of vertices and edges void read_data() { freopen("input.in", "r", stdin); // read from the input file cin >> V >> E; id.resize(V); weight.resize(V); edge.resize(V); int u; char s[100]; for (int i = 0; i < V; i++) { // read the names scanf("%d %[^\n]", &u, s); name[i] = string(s); id[i] = u; // origin ID by assigned ID reverseID[u] = i; // assigned ID by origin ID } int a, b, w; for (int i = 0; i < E; i++) { // read the edges and weights cin >> a >> b >> w; edge[reverseID[a]].push_back(reverseID[b]); edge[reverseID[b]].push_back(reverseID[a]); weight[reverseID[a]].push_back(w); weight[reverseID[b]].push_back(w); } }
main.cpp #include "definitions.h" #include "degree.h" #include "dfsbfs.h" #include "bridges_articulations.h" #include "cliques.h" #include "spanning.h" #include "cut.h" int main() { read_data(); degree(); count_components(); calculate_diameter(); find_cliques(); get_spanning_tree(); find_bridges_and_articulations(); find_cut(); }
é ç¹åºŠ
æå§ãã«ãéåžžã«åçŽãªãã®ãå®è£
ããŠã¿ãŸããããããã¯ã¢ã«ãŽãªãºã ãåŒã³åºãã®ã¯æ¥ããããããšã§ãããèªè
/èŠèŽè
ã«ãšã£ãŠè峿·±ããã®ã«ãªããŸãã åé ç¹ã®æ¬¡æ°ãèŠã€ããŸãã é ç¹ã®æ¬¡æ°ã¯ãé ç¹ã«å
¥å°ããïŒé£æ¥ããïŒãšããžã®æ°ã§ãã ã°ã©ãã®ã³ã³ããã¹ãã§ãã®ãã©ã¡ãŒã¿ãŒã䜿çšãããšããã£ã©ã¯ã¿ãŒã®ãåéãã®æ°ãããããŸãã
ããã¯1ã€ã®ãã¹ã§å®è¡ã§ãããã®ã¢ã«ãŽãªãºã ã®è€éãã¯OïŒV + EïŒã§ãã ç§ãè¡ã£ãããã«ãçµæãé©çšããŠãœãŒããããšãè€é床ã¯OïŒE + V * logïŒVïŒïŒã«ãªããŸãã
é ç¹åºŠã¢ã«ãŽãªãºã #include "definitions.h" void degree() { freopen("degree.txt", "w", stdout);
äžäœ10åã®å€éæ¥ç¶æåïŒ
- ã¿ã€ãªãªã³ã©ãã¹ã¿ãŒïŒ168
- ãžã§ã³ã»ã¹ããŒïŒ128
- ã¢ãŒã€ã»ã¹ã¿ãŒã¯ïŒ104
- ãžã§ã€ããŒã»ã©ãã¹ã¿ãŒïŒ102
- Cersei LannisterïŒ86
- ã«ãã£ãªãŒã³ã»ã¹ã¿ãŒã¯ïŒ85
- ã»ãªã³ã°ã¬ã€ãžã§ã€ïŒ76
- ãã£ããªã¹ã»ã¿ãŒã¬ãªãšã³ïŒ73
- ããªãšã³ãïŒ71
- ãããã¹ã¿ãŒã¯ïŒ69
å
šãªã¹ãè峿·±ãããšã«ãå€ãã®äººã«ç²ŸéããŠããŠã人ã
ãšã®æ¥è§Šãç¶æããããã«å¿
èŠãªäººããŽã¡ãªã¹ïŒåœŒã¯25äœïŒãããªãã£ãã®ã¯è峿·±ãããšã§ãã ãããããã®ä»£ããã«ãã£ãã¿ãŒããŸã ãªãäºæ¬¡ãã£ã©ã¯ã¿ãŒã®ããªãšã³ãã¯9äœã«ããããã§ãã
ãã©ããŒãµã«ãã«ãŠã³ããã
ããã§ã¯ãåçŽãªã¢ã«ãŽãªãºã ãã€ãŸããæ·±ãã§ã®æ€çŽ¢ïŒ
æ·±ãåªå
æ€çŽ¢ ïŒãšå¹
ã§ã®æ€çŽ¢ïŒ
å¹
åªå
æ€çŽ¢ ïŒã«ç§»ããŸãããã äž¡æ¹ã®ã¢ã«ãŽãªãºã ã¯éåžžã«ãã䌌ãŠãããã°ã©ãã®ééæ¹æ³ã®ã¿ãç°ãªããŸãã ã°ã©ãå
ã®ç¹å®ã®é ç¹ããå¥ã®é ç¹ã«ãšããžãç§»åããå¿
èŠãããå Žåã«äœ¿çšãããŸãã æ·±ãæ€çŽ¢ã®å Žåãã°ã©ãã¯äžããé ã«ãåºåãšããžã®1ã€ã«æ²¿ã£ãŠæå€§æ·±ããŸã§å®è¡ãããŸãã å¹
åªå
æ¢çŽ¢ã®å Žåãã°ã©ãã¯æåã«ãã¹ãŠã®é£æ¥ããé ç¹ãå·¡åããæ¬¡ã«é£æ¥ããé ç¹ã®é£æ¥ç¹ã«æ²¿ã£ãŠå·¡åããæšªæããé ç¹ããªããªããŸã§ç¶ããŸãã ã©ã¡ãã®ã¢ã«ãŽãªãºã ã«ãOïŒV + EïŒã®è€éãããããŸãã
ã°ã©ãã®æ¥ç¶æ§
ã°ã©ãã®æ¥ç¶ã³ã³ããŒãã³ããèŠã€ããŸãã æ¥ç¶ãããã³ã³ããŒãã³ãã¯ããã¹ãŠã®é ç¹ãã³ã³ããŒãã³ãã®ä»ã®é ç¹ãžã®ãã¹ãæã€ãµãã°ã©ãã§ãã ãããè¡ãã«ã¯ãããããã®é ç¹ã§æ€çŽ¢ã¢ã«ãŽãªãºã ã詳现ã«å®è¡ããå®äºåŸãã¢ã«ãŽãªãºã ã§ããŒã¯ãããŠããªã次ã®é ç¹ã§æ€çŽ¢ã¢ã«ãŽãªãºã ãå®è¡ããŸãã ãããã£ãŠãåæ€çŽ¢ã®å®è¡ã¯ãæ°ããæ¥ç¶ã³ã³ããŒãã³ããæå³ããŸãã
æ¥ç¶ã³ã³ããŒãã³ãã®ã«ãŠã³ãã³ãŒã #include "definitions.h" vector<bool> useddfs; vector<int> comp; void dfs(int u) { useddfs[u] = true; comp.push_back(u); for (vector<int>::iterator i = edge[u].begin(); i != edge[u].end(); i++) if (!useddfs[*i]) dfs(*i); } void count_components() { freopen("components.txt", "w", stdout); // output file int comp_num = 0; useddfs.resize(V, false); for (int i = 0; i < V; i++) { if (!useddfs[i]) { comp.clear(); dfs(i); comp_num++; } } cout << comp_num; }
ã°ã©ããæ¥ç¶ãããŠãããããã®äžã«è€æ°ã®ã³ã³ããŒãã³ããããå Žåãããã¯éåžžã«å¥åŠã§ãããïŒ ããããé©ããããšã«ãã°ã©ãã«ã¯ãã§ã«3ã€ã®ã³ã³ããŒãã³ãããããŸããïŒ ããããããããèŠããšã倧ããªã³ã³ããŒãã³ãã1ã€ãä»ã®2ã€ã®ã³ã³ããŒãã³ãããããããããã«1人ã®ãã£ã©ã¯ã¿ãŒãããããšãããããŸããïŒåœŒãã¯ç¬é¡ã®è人ïŒ
ã¹ãã€ãªãŒã®è人 ïŒã§ãããç¥ã®ç®ïŒ
ç¥ã®ç® ïŒã®è¿ãã§ã¢ãŒãªã¢ãšè©±ããŸããã
ã¯ã㯠ïŒãè¹ã§ã¿ã€ãªãªã³ãšéãã ïŒã çããããšã§ã¯ãªããååããªããäŒè©±ã®åå è
ãäžè¬çã«æ£ããæ±ºå®ããã®ã¯é©ãã¹ãããšã§ãã ãã¡ãããæ¬ èœããŠãããšããžã远å ããçµæãã°ã©ãå
šäœãæ¥ç¶ãããããšãããããŸããã
æ¡æçè«
æ€çŽ¢ã¢ã«ãŽãªãºã ã䜿çšããŠæ¬¡ã«èŠã€ãããã®ã¯ãã§ã«åºããªã£ãŠããŸã-ã°ã©ãå
ã®ãã³ãã·ã§ã€ã¯ã®æå€§æ°ãã€ãŸãã°ã©ãã®çŽåŸãã€ãŸãã°ã©ãã®ãã¹ãŠã®é ç¹éã®æé·çµè·¯ã 倿ããããã«ããã³ãã·ã§ã€ã¯ã®æå€§æ°ã¯8
ã§ãã6ã€ã®ãã³ãã·ã§ã€ã¯ã®çè«ãèãããšããäžäžãã«é¢ããç ç©¶ã§ã¯è¯ãçµæã§ãã ããšãã°ã次ã®éä¿¡ãã§ãŒã³ã®ããããïŒ
ãã¶ãŒã»ã¢ãŒã« -
ã·ã¹ã« -ãã©ããŒã«-
ãžã§ã³ã»ã¹ã㌠-
ãããã»ã¹ã¿ãŒã¯ -
ããªã¹ã¿ã³ã»ã»ã«ã㌠-
ã¯ãšã³ãã£ã³ã»ããŒãã« -
ãŒããŒãã®çåãŒããŒãã®
çåæ§ ïŒ-ã«ã€ã¹ã»ã©ã³ã¹ã¿ãŒ
ãã®ãããªã¢ã«ãŽãªãºã ã¯OïŒV * V + V * EïŒã§æ©èœããŸãã ã°ã©ãã®åé ç¹ããBFSã¢ã«ãŽãªãºã ãå®è¡ããå¿
èŠãããããã ãã®ã°ã©ãã
ããªãŒã®å ŽåãBFSã2åå®è¡ããã ãã§æžã¿ãŸãã æåã«ã°ã©ãã®ä»»æã®é ç¹ãããæ¬¡ã«ã°ã©ãããæãé ãé ç¹ããã ãããŠãæåŸã®æã¡äžãã®æå€§ã®æ·±ãã¯ãã°ã©ãã®çŽåŸã«ãªããŸãã
ãããŠãã°ã©ãã®ãã¹ãŠã®é ç¹ã®æé·ãã¹ãèŠã€ããã®ã§ãå¹³åå€ãèšç®ããæå€§ãã¹ã®ååžãæ§æã§ããŸãã æå€§ãã¹ã®é·ãã®å¹³åå€ã¯6.16ã§ããããšã倿ãïŒå¹³åã§ã¯6ãã³ãã·ã§ã€ã¯ã®çè«ã«é©åããŸãïŒãåèšå¹³åè·é¢ã¯3.6ã§ããããã«å¯ŸããŠãFacebookã®å Žåããã®ãã©ã¡ãŒã¿ãŒã¯4.57ã§ãã
æå€§ãã¹ã®é·ãã®ååžïŒ
ååžãèŠããšã77æåãã°ã©ãã®ãäžå¿ãã«äœçœ®ããŠããããšãããããŸããã€ãŸããä»ã®4人以äžã®ãã£ã©ã¯ã¿ãŒãšéä¿¡ã§ããŸãã ãã®äžã«ã¯ãDineris TargaryenãšSansa Starkãé€ããã¹ãŠã®äž»äººå
¬ãããŸãããŸããæ¬ã§5ç« æªæºã®ç« ãåãäžããããŠãã人ã®äžã«ã¯ãBarristan SelmiãJohn ConningtonãMelisandraããªã¹ãã«èŒã£ãŠããŸãã
å
šäœã®çµææå®ããããã©ã¡ãŒã¿ãŒãèŠã€ããããã®ã³ãŒã #include "definitions.h" vector<bool> usedbfs; void bfs(int u, vector<int> &distance, vector<int> &path) { queue<int> q; q.push(u); usedbfs[u] = true; path[u] = -1; while (!q.empty()) { int u = q.front(); q.pop(); for (vector<int>::iterator i = edge[u].begin(); i != edge[u].end(); i++) { int to = *i; if (!usedbfs[to]) { usedbfs[to] = true; q.push(to); distance[to] = distance[u] + 1; path[to] = u; } } } } void calculate_diameter() { freopen("diameter.txt", "w", stdout); // output file int diameter = 0; int current_max = 0; double average_max = 0; double average_average = 0; vector< vector<int> > distribution(V, vector<int> (0)); vector< vector<int> > max_path; vector<int> farthest_node; for (int i = 0; i < V; i++) { vector<int> distance_to(V, 0); vector<int> path(V,-1); usedbfs.clear(); usedbfs.resize(V, false); bfs(i, distance_to, path); current_max = 0; for (int j = 0; j < V; j++) { average_average += distance_to[j]; if (distance_to[j] > current_max) current_max = distance_to[j]; if (distance_to[j] > diameter) { diameter = distance_to[j]; farthest_node.clear(); max_path.clear(); max_path.push_back(path); farthest_node.push_back(j); } else if (distance_to[j] == diameter){ max_path.push_back(path); farthest_node.push_back(j); } } average_max += current_max; distribution[current_max].push_back(i); } average_max /= V; average_average /= V*V; cout << "Diameter: " << diameter << endl; cout << "Average path: " << average_average << endl; cout << "Average farthest path: " << average_max << endl; vector < vector<int> > farthest_path; for (int i = 0; i < farthest_node.size(); i++) { farthest_path.push_back(vector<int>()); for (int u = farthest_node[i]; u != -1; u = max_path[i][u]) farthest_path[i].push_back(u); } cout << "Farthest paths:" << endl; for (int i = 0; i < farthest_path.size(); i++) { cout << i+1 << ": "; for (vector<int>::iterator j = farthest_path[i].begin(); j != farthest_path[i].end(); j++) cout << name[*j] << ". "; cout << endl; } int minimum = V; cout << "Farthest paths distribution:" << endl; for (int i = 0; i <= diameter; i++) { if (distribution[i].size() != 0 && i < minimum) minimum = i; cout << i << ": " << distribution[i].size() << endl; } cout << "Characters with minimum farthest path:" << endl; for (vector<int>::iterator i = distribution[minimum].begin(); i != distribution[minimum].end(); i++) { cout << name[*i] << endl; } }
ã°ã©ãå
ã®ã¯ãªãã¯
Bron-Kerboschã¢ã«ãŽãªãºã ã䜿çšãããšãã°ã©ãå
ã®æå€§ã¯ãªãŒã¯ãã€ãŸãé ç¹ã®ãµãã»ãããæ€çŽ¢ã§ããŸããé ç¹ã®ãµãã»ããã¯ãšããžã§æ¥ç¶ãããŠããŸãã åé¡ã®ã°ã©ãã®ã³ã³ããã¹ãã§ã¯ãããã«ãããæŽå²äžçžäºã«éä¿¡ããŠãã匷ãé¢é£ããäŒæ¥ãèŠã€ããããšãã§ããŸãã ã¢ã«ãŽãªãºã ã®è€éãã¯ã°ã©ãã®ã¯ãªãã¯æ°ã«å¯ŸããŠç·åœ¢ã§ãããææªã®å Žåã¯ææ°OïŒ3
V / 3 ïŒã§ãããã¢ã«ãŽãªãºã ã¯NPå®å
šåé¡ããã¹ãŠåãããã«è§£æ±ºããŸãã ã¢ã«ãŽãªãºã èªäœã¯ãé ç¹ããšã«æå€§ã¯ãªãã¯ãèŠã€ããååž°é¢æ°ã§ãã ä»ã®é ç¹ã远å ã§ããªããã®ã çµæã¯æ¬¡ã®ãšããã§ãã
ã¯ãªãã¯ãµã€ãºååžïŒ
ã芧ã®ãšãããæå€§ã¯ãªãã¯ãµã€ãºã¯9æåã§ãã ããšãã°ããããã®1ã€ã¯ã©ãã¹ã¿ãŒäŒç€Ÿã§ããã¿ã€ãªãªã³ããžã§ã€ããŒãã»ã«ã»ã€ãããªã¹ãã¿ã€ãŠã£ã³ãã±ãã³ããã»ã«ãããã£ã«ãã¡ã€ã¹ã¿ã€ã¬ã«ã§ãã è峿·±ãããšã«ããµã€ãº8ãš9ã®ã¯ãªãã¯ã¯ãã¹ãŠããã€ã€ã«ããŒããŒãŸãã¯ãã®è¿ãã§åœ¢æãããŸãã ãããŠãDinerisã§ã®æå€§ã¯ãªãã¯ã¯ãµã€ãº5ã§ãã
å
šäœã®çµæã¯ãªãã¯ã³ãŒã #include "definitions.h" vector < vector<int> > cliques; bool compare_vectors_by_size(const vector<int> &i, const vector<int> &j) { return (i.size() > j.size()); } void bron_kerbosch(set <int> R, set <int> P, set <int> X) { // where R is probable clique, P - possible vertices in clique, X - exluded vertices if (P.size() == 0 && X.size() == 0) { // R is maximal clique cliques.push_back(vector<int>(0)); for (set<int>::iterator i = R.begin(); i != R.end(); i++) { cliques.back().push_back(*i); } } else { set <int> foriterate = P; for (set<int>::iterator i = foriterate.begin(); i != foriterate.end(); i++) { set <int> newR; set <int> newP; set <int> newX; newR = R; newR.insert(*i); set_intersection(P.begin(), P.end(), edge[*i].begin(), edge[*i].end(), inserter(newP, newP.begin())); set_intersection(X.begin(), X.end(), edge[*i].begin(), edge[*i].end(), inserter(newX, newX.begin())); bron_kerbosch(newR, newP, newX); P.erase(*i); X.insert(*i); } } } void find_cliques() { freopen("cliques.txt", "w", stdout); // output file set <int> P; for (int i = 0; i < V; i++) { P.insert(i); stable_sort(edge[i].begin(), edge[i].end()); } bron_kerbosch(set<int>(), P, set<int>()); stable_sort(cliques.begin(), cliques.end(), compare_vectors_by_size); cout << "Distribution:" << endl; int max_size = 0; int max_counter = 0; for (int i = cliques.size()-1; i >= 0 ; i--) { if (cliques[i].size() > max_size) { if (max_counter > 0) { cout << max_size << ": " << max_counter << endl; } max_size = cliques[i].size(); max_counter = 0; } max_counter++; } if (max_counter > 0) { cout << max_size << ": " << max_counter << endl; } cout << "Cliques:" << endl; for (int i = 0; i < cliques.size(); i++) { cout << i + 1 << "(" << cliques[i].size() << "): "; for (int j = 0; j < cliques[i].size(); j++) { cout << name[cliques[i][j]] << ". "; } cout << endl; } }
ã¹ããã³ã°ããªãŒ
ãããŠä»ãæ¥ç¶ã®ã°ã©ããå°ãåçŽåãããã®äžã«ãããã¯ããŒã³ãããããã
ã¹ããã³ã°ããªãŒ ãã€ãŸã æãéèŠãªã³ãã¥ãã±ãŒã·ã§ã³ãšããžã§ãããšåæã«ãã°ã©ãããã¹ãŠã®å
ã®é ç¹ãæã€ããªãŒã«å€ããŸãã
Kruskalã¢ã«ãŽãªãºã ã¯ããã«åœ¹ç«ã¡ãŸãã ã¢ã«ãŽãªãºã ã¯è²ªæ¬²ã§ãã2ã€ã®ã³ã³ããŒãã³ããæ¥ç¶ããŠããå Žåããã®å®è£
ã§ã¯ãéã¿ã§ãã¹ãŠã®ãšããžããœãŒãããåãšããžãé çªã«è¿œå ããã ãã§ãã æ£ããããŒã¿æ§é ã䜿çšããå ŽåïŒéåžžã
äºãã«çŽ ãªã·ã¹ãã ã䜿çšãããŸãïŒãã¢ã«ãŽãªãºã ã®è€éãã¯OïŒEïŒlogEïŒ+ V + EïŒ= OïŒEïŒlogVïŒïŒã§ãã 以äžã¯ããããã®æäœãåããã°ã©ãã®çµæã§ãã èªã¿ãããããããã«ãéã¿1ã®ãšããžãåé€ããŸããã
åçã¯ã¯ãªãã¯å¯èœã§ããããã£ãŠããã®ã°ã©ããããã¡ã€ã³ãã£ã©ã¯ã¿ãŒãšãããã®çžäºé¢ä¿ã確èªã§ããŸãã äºæ³éããTyrion Lannisterã¯ãã¹ãŠã®é¢ä¿ã®ãäžå¿ãã«ããã4ã€ã®å€§ããªæã圌ããæ¥ãŠããŸããCerseiLannisterãJohn SnowãSansa StarkãJorah MormontïŒDinerisæïŒã§ãã åŸè
ã¯ãéä¿¡ã®æ¬¡ã®ã¬ãã«ã®ããŒããŒã§ãã ããªãæåŸ
ããçµæã§ã¯ãããŸãããïŒ
å
šäœã®çµæã¹ããã³ã°ããªãŒãã«ãã³ãŒã #include "definitions.h" vector<int> p; int dsu_get(int v) { return (v == p[v]) ? v : (p[v] = dsu_get(p[v])); } void dsu_unite(int u, int v) { u = dsu_get(u); v = dsu_get(v); if (rand() & 1) swap(u, v); if (u != v) p[u] = v; } void get_spanning_tree() { freopen("spanning.txt", "w", stdout); // output file vector < pair < int, pair<int, int> > > edges_weights, result; vector < vector<bool> > used; for (int i = 0; i < V; i++) { used.push_back(vector<bool>(V, false)); } for (int i = 0; i < V; i++) { for (int j = 0; j < edge[i].size(); j++) { int cur_v = edge[i][j]; if (!used[i][cur_v]) { edges_weights.push_back(make_pair(weight[i][j], make_pair(i, cur_v))); used[i][cur_v] = true; used[cur_v][i] = true; } } } sort(edges_weights.begin(), edges_weights.end(), greater< pair < int, pair<int, int> > >()); for (int i = 0; i < V; i++) { p.push_back(i); } for (int i = 0; i < E; i++) { int u = edges_weights[i].second.first; int v = edges_weights[i].second.second; int w = edges_weights[i].first; if (dsu_get(u) != dsu_get(v)) { result.push_back(edges_weights[i]); dsu_unite(u, v); } } for (vector < pair < int, pair<int, int> > >::iterator i = result.begin(); i != result.end(); i++) { cout << id[(i->second).first] << " " << id[(i->second).second] << " " << i->first << endl; } }
ããããæå€§ã®ãã®ã ãã§ãªããããã€ã®åèšã¹ããã³ã°ããªãŒãæ§ç¯ã§ããŸããïŒ ãã¡ããããã®ã³ã©ã ã§ã¯ä¿¡ããããªãã»ã©ããããã ãããããããã¯
ãã«ããããã®å®çã䜿çšããŠèšç®ã§ããŸãã å®çã«ããã°
ã飿¥è¡åã®ãã¹ãŠã®èŠçŽ ãå察ã®èŠçŽ ã§çœ®ãæãããã察å¿ããé ç¹ã®æ¬¡æ°ã䞻察è§äžã«ããè¡åãæ§ç¯ãã
ãšãçµæã®è¡åã®
代æ°çå ç®ã¯ãã¹ãŠçãããªãããã®å€ã¯ã°ã©ãã®ã¹ããã³ã°ããªãŒã®æ°ã«ãªããŸã
ããªããžãšãã³ãž
ã°ã©ãå
ã®ããªããžã¯ãšããžãšåŒã°ããåé€ããããšæ¥ç¶ã³ã³ããŒãã³ãã®æ°ãå¢å ããŸãã ãã³ãžã«ãåæ§ã®å®çŸ©ããããŸãããããªããžãšã¯ç°ãªãããã³ãžã¯é ç¹ã§ãããåãå€ããšæ¥ç¶ãããã³ã³ããŒãã³ãã®æ°ãå¢ããŸãã ãã®ã³ã©ã ã§ã¯ãããªããžã®ååšã¯ãç座ã®äžçã§ã¯ãã£ã©ã¯ã¿ãŒã®åã
ã®ã°ã«ãŒãéã®å¯äžã®ã³ãã¥ãã±ãŒã·ã§ã³ã®ãœãŒã¹ã§ããæ¥ç¶ãããããšãæå³ããŸãã äžæ¹ããã³ãžã¯ãä»ã®ãã£ã©ã¯ã¿ãŒã®ã°ã«ãŒãã®å¯äžã®ä»²ä»è
ã§ããããŒããŒã§ãã ããªããžãšãã³ãžã®æ€çŽ¢ã¯ããã»ã©é£ãããããŸããã ãããè¡ãã«ã¯ãããªãã¿ã®æ·±ãæ€çŽ¢ã¢ã«ãŽãªãºã ãå¿
èŠã§ãããå°ã倿ŽãããŠããŸãã é ç¹ãžã®ããããå
¥å£æéãšé ç¹ã®åºå£æé颿°ïŒ
fout ïŒã䜿çšããå¿
èŠããããŸããããã¯ãæ·±ãæ€çŽ¢ãæž¡ãããé ç¹ã®æå°å
¥å£æéãš
foutå€ã®å€ãåãããããšããžãæž¡ããšãã«ã颿°ã®å€ã倿ããŸãäžéšã®
foutã¯ãããã«å
¥ããŸã§ã®æé以äžã§ãããããã¯ããªããžã§ãããšåæã«ãã³ãžã§ãããçããå Žåã¯ãã³ãžã®ã¿ã«ãªããŸãã èšãæãããšãåããšããž/é ç¹ã«ç§»åããåŸã«æ»ããã°ã©ãã®äžéšãç§»åãããšãã«ã®ã¿æ»ããã©ããã確èªããŸããããããå Žåãããã¯ç®çã®ããªããžãŸãã¯ãã³ãžã«ãªããŸãã
äºæ³ã©ããããã¹ãŠã®ãã³ãžãšããªããžã¯éèŠã§ãªãæåã®ã¿ãã«ããŒããŠããŸããã ãã³ãžãšããªããžãåé€ããããšã§åé¢ã§ããã³ã³ããŒãã³ãã®é ç¹ã®æ°ã¯ã4åãè¶
ããŸããã ããã¯ãç ç²ã«ããããšãã§ããªãã£ãããŒããŒãããªãããšãæå³ããŸãã ãã¹ãŠã¯ãå°ãªããšã2ã€ã®ä»ã®ãã£ã©ã¯ã¿ãŒãä»ããŠçžäºæ¥ç¶ãããŠããŸãã
å
šäœã®çµæããªããžãšãã³ãžã®æ€çŽ¢ã³ãŒã #include "definitions.h" vector<bool> used, usedcnt; int timer = 0; vector<int> tin, fout, articulations; vector < pair<int,int> > bridges; int count_rec(int v, int skip) { int cnt = 1; usedcnt[v] = true; for (int i = 0; i < edge[v].size(); i++) { int to = edge[v][i]; if(to == skip || usedcnt[to]) continue; cnt += count_rec(to, skip); } return cnt; } int count_from(int v, int skip, bool clean = true){ usedcnt.resize(V, false); if (clean) { for (int i = 0; i < usedcnt.size(); i++) usedcnt[i] = false; } return count_rec(v, skip); } void dfs(int v, int prev = -1) { used[v] = true; tin[v] = fout[v] = timer++; int root_calls = 0; bool in_ar_list = false; for (int i = 0; i < edge[v].size(); i++) { int to = edge[v][i]; if (to == prev) continue; if (used[to]) fout[v] = min(fout[v], tin[to]); else { dfs(to, v); fout[v] = min(fout[v], fout[to]); if (fout[to] > tin[v]) { bridges.push_back(make_pair(v, to)); } if (fout[to] >= tin[v] && prev != -1 && !in_ar_list) { articulations.push_back(v); in_ar_list = true; } root_calls++; } } if (prev == -1 && root_calls > 1) articulations.push_back(v); } void find_bridges_and_articulations() { freopen("bridges_and_articulations.txt", "w", stdout); // output file used.resize(V, false); tin.resize(V); fout.resize(V); for (int i = 0; i < V; i++) if (!used[i]) dfs(i); cout << "Bridges:" << endl; for (int i = 0; i < bridges.size(); i++) { cout << name[bridges[i].first] << " (" << count_from(bridges[i].first, bridges[i].second) << ") - " << name[bridges[i].second] << " (" << count_from(bridges[i].second, bridges[i].first) <<")" << endl; } cout << endl << "Articulation points:" << endl; for (int i = 0; i < articulations.size(); i++) { int cur = articulations[i]; cout << name[cur]; for (int i = 0; i < usedcnt.size(); i++) usedcnt[i] = false; for (int j = 0; j < edge[cur].size(); j++) { if (!usedcnt[edge[cur][j]]) { int comp_size = count_from(edge[cur][j], cur, false); cout << " (" << comp_size << ")"; } } cout << endl; } }
æå°ã«ãã
ããããïŒäžèšã®çµ±èšã«ãããšïŒæã人æ°ã®ãã2人ã®ãã£ã©ã¯ã¿ãŒãããšãã°Tirion LannisterãšArya StarkããŸãã¯John SnowãšCersei Lannisterã®éã®æ¥è§Šãå®å
šã«æé€ããããã«ã殺ããå¿
èŠãããããŒããŒã®æ°ãç¥ãããšã¯è峿·±ãããšã§ãã ãã®ããã«
ãDynitsã¢ã«ãŽãªãºã ã䜿çš
ããŸã ã æåã«ãã¢ã«ãŽãªãºã ãã©ã®ããã«æ©èœããããçè§£ããŸãããã
Ford-Fulkersonã®å®çã«ããã°
ããã¹ã°ã©ãã®æå€§ãããŒã¯æå°ã»ã¯ã·ã§ã³ã®ã¹ã«ãŒãããã«çãããªããŸãã ã€ãŸãã2ã€ã®é ç¹ïŒã·ã³ã¯ãšãœãŒã¹ïŒéã®æå°ã«ãããèŠã€ããããšãã§ããŸãããããã®é ç¹éã®æå€§ãããŒãèŠã€ãã£ãå Žåã§ãã Dynitsã¢ã«ãŽãªãºã ã䜿çšãããšãæå€§ãããŒãå®éã«ã¯ãããŒèªäœãèŠã€ããããšãã§ããŸãã ã¢ã«ãŽãªãºã ã詳现ã«åæããããšã¯ãããèªåã§ã¢ã«ãŽãªãºã ãçè§£ããæ©äŒãäžããŸãã çµæãçè§£ããã«ã¯ããããŒãç¹å®ã®é¢æ°ã§ããããœãŒã¹ãããã¬ã€ã³ãžã®ãã¹äžã«ããåãšããžã«ã€ããŠããã®ãšããžã®ã¹ã«ãŒããããè¶
ããªãæ£ã®å€ã決å®ããããšãç¥ãã ãã§ååã§ãã åçŽåããããã«ãæé
tã§æ°Žæºããææ°Žå£ã«æµããæ°Žã®éãæµéã®å€ã§ãããæ°Žãå«ããã€ãã·ã¹ãã ãæ³åã§ããŸãã
ç§ãèšå®ããã¿ã¹ã¯ã¯ãã¢ã«ãŽãªãºã ã解決ããã¿ã¹ã¯ãšã¯å°ãç°ãªããŸãã å®éã«ã¯ããããŒã¯ãšããžã§æ±ºå®ãããæå°ã«ãããèŠã€ãããšããšããžã«æ²¿ã£ãŠã°ã©ãããã«ããããããŸãã ã°ã©ãå
ã®æ¥ç¶ã§ããããšããžã«æ²¿ã£ãŠã§ã¯ãªããé ç¹ã«æ²¿ã£ãŠã°ã©ããã«ããããå¿
èŠããããŸãã æåã ãã®åé¡ã解決ããã«ã¯ãã°ã©ããå°ã倿Žããå¿
èŠããããŸãã ã°ã©ãã®åé ç¹ãåå²ããé ç¹
vã®ä»£ããã«é ç¹
v 1ãš
v 2ãååŸãã2ã€ã®é ç¹
vãš
uã®éã«ãšããžããã£ãå Žåããšããžã®ä»£ããã«
v 1ã
u 2ã« ã
u 1ã
v 2ã«ãªãã€ã¬ã¯ãããŸã
ïŒu ãvïŒãšããž
ïŒv 1 ãu 2 ïŒããã³
ïŒu 1 ãv 2 ïŒãååŸããŸãã ãããŠããã©ãŒã¯ãããåé ç¹
v 1ãš
v 2ã®éã«ãšããž
ïŒv 2 ãv 1 ïŒãæããŸãã åä¿¡ããããã§ã«æ¹åä»ããããã°ã©ãã§ã¯ããã¹ãŠã®æ¥ç¶ãä¿æãããŸãããåã«ããŒã¯ããã£ãå Žæã§ã¯ãšããžã衚瀺ãããŸãã ãããã®ãšããžã®éã¿ã1ã§ãä»ã®ãã¹ãŠã®å Žåãç¡éãšèšãå ŽåïŒå®éã«ã¯ãã°ã©ãå
ã®é ç¹ã®æ°ã䜿çšã§ããŸãïŒãåå²ããé ç¹éã®ãšããžã¯ã°ã©ãå
ã§æã匱ããªã³ã¯ã«ãªããããã¥ãŒãºãã®ååã«åŸã£ãŠã倧ããªã¹ããªãŒã ãããèªäœãééã§ããªããªããŸãã¯ãã°ã©ããåæããããã«åé€ããå¿
èŠãããé ç¹ã®æ°ãèŠã€ããæ©äŒãæäŸããŸãã æ¬¡ã«ãçµæã®ã°ã©ãã§Dynitsã¢ã«ãŽãªãºã ãå®è¡ããŸãã
ã¢ã«ãŽãªãºã ã®è€éãã¯OïŒn
2 mïŒã§ãã ãããã£ãŠãé ç¹ã®ãã¹ãŠã®ãã¢ã®æå€§ãããŒå€ãæ€çŽ¢ããã®ã§ã¯ãªããæ¥ç¶æ°ãæå€§ã®ãã£ã©ã¯ã¿ãŒã®ã¿ãæ€çŽ¢ããŸããããããªããšããã®ã°ã©ãã®å Žåãè€é床ã¯OïŒn
5 ïŒã«ãªããŸãïŒn = 1000ã§ããã¹ãŠãé·æéåäœããŸãïŒã 以äžã«ããªã³ã¯ã®äžäœ100æåã®çµæã瀺ããŸãã
çµæã«å°ãé©ããã ããã100ã§ã¯ãå°ãªããšã6æåãåãé€ãããšã§ã°ã©ããã«ããã§ããããšãããããŸããã ãã®å Žåã®ãã®ãããªæ¥ç¶ã«ã¯ãã¹ãŠããã¬ã€ã³/ãœãŒã¹ãšããŠãžã§ã³ã³ãã³ã°ãã³ãŸãã¯ãŠãŒãã³ã°ã¬ã€ãžã§ã€ã®ãããããå«ãŸããŸãã ãããããããã¯äž»äººå
¬ã§ã¯ãããŸããã è峿·±ãããšã«ãããã10ã§ã¯ãåºæ¬çã«æå°ãããŒã¯çŽ45ã§ãã ããšãã°ãTyrionãšAryaã®éã®ãããŒã¯53ã§ãããJohn SnowãšCersei 42ã®éã§ãããããã16åã®ä»ã®ãã£ã©ã¯ã¿ãŒãåé€ããããšã«ãã£ãŠåé¢ã§ãããã£ã©ã¯ã¿ãŒããããŸãã 圌女ã¯ç座ã®å°å³äžã§æãé ãããã€ã³ã§ãããããããã¯é©ãããšã§ã¯ãããŸããããDineris Targaryenã§ãã
ã¹ããªãŒã å
ã§æããéèŠãªãããŒããŒã誰ã§ããããç¥ãããšãè峿·±ãã§ãããã ã€ãŸã
æå€§æµéãæãé »ç¹ã«æµãã人ãé©ãã¹ãããšããããŸããã¹ããªãŒã å
ã®äžäœ10åã®éèŠãªæåïŒæ¬åŒ§å
ã¯ãã¹ããªãŒã å
ã®å¯Ÿå¿ãããšã³ããªæ°ã§ãïŒïŒ- ã¿ã€ãªãªã³ã©ãã¹ã¿ãŒïŒ4109ïŒ
- ãžã§ã€ããŒã»ã©ãã¹ã¿ãŒïŒ3067ïŒ
- ã¢ãŒã€ã»ã¹ã¿ãŒã¯ïŒ3021ïŒ
- ãžã§ã³ã»ã¹ããŒïŒ2883ïŒ
- ãšããŒãã»ã¹ã¿ãŒã¯ïŒ2847ïŒ
- ã»ã«ã»ã€ã©ãã¹ã¿ãŒïŒ2745ïŒ
- ã»ãªã³ã»ã°ã¬ã€ãžã§ã€ïŒ2658ïŒ
- ããªãšã³ãïŒ2621ïŒ
- ãµã³ããŒã«ã»ã¯ã¬ã¬ã³ïŒ2579ïŒ
- ãããã¹ã¿ãŒã¯ïŒ2573ïŒ
ãŸãããšããŒãã»ã¹ã¿ãŒã¯ã¯éèŠãªãã£ã©ã¯ã¿ãŒã§ãããæ®å¿µãªããïŒãŸãã¯å¹žããªããšã«ïŒåœŒãã¯spareããŸãªãã第äºã«ã1ã€ã®ç« ãæžãããŠããªãSandor Cleganeã¯ãäŸç¶ãšããŠéèŠãªãã£ã©ã¯ã¿ãŒã§ãã第äžã«ãããã10ã®æåããå°ãªããšãä»ã®ãšãããéåžžã«ç²ã匷ãã§ãããæãè峿·±ãã®ã¯ããããã®10åã®æåããããšããããšã§ããïŒ11ãžã§ããªãŒLannister12ããã»ã¹ã¿ãŒã¯13. Renly baratheonã14 Catelynã¹ã¿ãŒã¯15 Rooseãã«ãã³16 Yoren17ãµã 18. Melisandra19. Bran Stark20.æ¬ã®äžäœ6人ã®ãã£ã©ã¯ã¿ãŒãæ¢ã«æ®ºãããŠããããªãšãŒã·ã§ã³5ãããã10ãenãŸãªããæ¬¡ã¯èª°ã§ããïŒãŸãããããŒã®ãããã§ããäœåãªãããŒã¯ãèšç®ããããšãã§ããŸãããã¬ããªã«ã®äœè
ã¯æ£ããèªèã§ããªãã£ãããã亀差ããŠã¯ãããªãå€ãã®ãã£ã©ã¯ã¿ãŒã«é¢é£ä»ããããŠããŸããã圌ãã¯ç·ïŒç·ïŒãšã¬ãŒãã£ã¢ã³ïŒèŠåå¡ïŒã§ããããšã倿ããŸããããã®çµæããããã®é ç¹ãåé€ãããã¹ãŠã®çµ±èšãåéèšããŸãããå
šäœã®çµæé ç¹ã«æ²¿ã£ãæå°ã«ãããèŠã€ããããã®ã³ãŒã #include "definitions.h" const int INF = 1000000000; struct edge_s{ int a, b, c, flow;
ããã ãã§ã
çµè«ãšããŠãTyrion Lannisterã¯ç座ã®äžçã§éåžžã«éèŠãªãã£ã©ã¯ã¿ãŒã§ããããšã«æ³šæããããšãã§ããŸãããã®èšäºãããªãã«ãšã£ãŠè峿·±ããã®ã§ãããããããæçšã§ããããšãé¡ã£ãŠããŸãããã¹ãŠã®ã¢ã«ãŽãªãºã ã®ãœãŒã¹ã³ãŒããGitHubã«ãããŸãïŒä»¥äžã®ãªã³ã¯ïŒãåç
§ïŒ
GitHubãããžã§ã¯ããããžã§ã¯ããéãããšãã§ããå
ã®ãœãŒã·ã£ã«ã°ã©ãGephiããã°ã©ã èŠåºãã®åçã®èè
-Adam FosteræåŸã«ãçŽæãããããã«ãã¢ã³ã±ãŒãïŒæ¬ã®ãã€ã¢ãã°ã®èè
ãã©ã®ããã«æ±ºå®ããããã«ã€ããŠã®èšäºã翻蚳ãã䟡å€ã¯ãããŸããïŒ