
æè¿ã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); // output file vector< pair<int,int> > degree(V); for (int i = 0; i < V; i++) { degree[i] = make_pair(edge[i].size(), i); } stable_sort(degree.begin(), degree.end()); for (int i = V-1; i >= 0; i--) { cout << name[degree[i].second] << ": " << degree[i].first << endl; } }
äžäœ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ãžã§ããªãŒLannister
12ããã»ã¹ã¿ãŒã¯
13. Renly baratheonã
14 Catelynã¹ã¿ãŒã¯
15 Rooseãã«ãã³
16 Yoren
17ãµã
18. Melisandra
19. Bran Stark
20.
æ¬ã®äžäœ6人ã®ãã£ã©ã¯ã¿ãŒãæ¢ã«æ®ºãããŠããããªãšãŒã·ã§ã³5ãããã10ãenãŸãªãã次ã¯èª°ã§ããïŒ
ãŸãããããŒã®ãããã§ããäœåãªãããŒã¯ãèšç®ããããšãã§ããŸãããã¬ããªã«ã®äœè ã¯æ£ããèªèã§ããªãã£ãããã亀差ããŠã¯ãããªãå€ãã®ãã£ã©ã¯ã¿ãŒã«é¢é£ä»ããããŠããŸããã圌ãã¯ç·ïŒç·ïŒãšã¬ãŒãã£ã¢ã³ïŒèŠåå¡ïŒã§ããããšãå€æããŸããããã®çµæããããã®é ç¹ãåé€ãããã¹ãŠã®çµ±èšãåéèšããŸããã
å šäœã®çµæ
é ç¹ã«æ²¿ã£ãæå°ã«ãããèŠã€ããããã®ã³ãŒã
#include "definitions.h" const int INF = 1000000000; struct edge_s{ int a, b, c, flow; // a->b, c-capacity, flow=0 edge_s(int a, int b, int c, int flow) : a(a), b(b), c(c), flow(flow) {} }; vector< pair<int, int> > top_degree; vector< pair<int, int> > top_flow; vector<int> dis; vector<int> ptr; vector<edge_s> edgelist; vector< vector<int> > edges_dup; bool compare_pairs_by_second(const pair<int, int> &i, const pair<int, int> &j) { return (i.second > j.second); } bool bfs_dinic(int s, int t) { queue<int> q; q.push(s); dis[s] = 0; while (!q.empty() && dis[t] == -1) { int v = q.front(); q.pop(); for (int i = 0; i < edges_dup[v].size(); i++) { int ind = edges_dup[v][i], next = edgelist[ind].b; if (dis[next] == -1 && edgelist[ind].flow < edgelist[ind].c) { q.push(next); dis[next] = dis[v] + 1; } } } return dis[t] != -1; } int dfs_dinic(int v, int t, int flow) { if (!flow) { return 0; } if (v == t) { return flow; } for (; ptr[v] < (int) edges_dup[v].size(); ptr[v]++) { int ind = edges_dup[v][ptr[v]]; int next = edgelist[ind].b; if (dis[next] != dis[v] + 1) { continue; } int pushed = dfs_dinic(next, t, min(flow, edgelist[ind].c - edgelist[ind].flow)); if (pushed) { edgelist[ind].flow += pushed; edgelist[ind ^ 1].flow -= pushed; return pushed; } } return 0; } long long dinic_flow(int s, int t) { long long flow = 0; while (true) { fill(dis.begin(), dis.end(), -1); if (!bfs_dinic(s, t)) { break; } fill(ptr.begin(), ptr.end(), 0); while (int pushed = dfs_dinic(s, t, INF)) { flow += pushed; } } return flow; } void dinic_addedge(int a, int b, int c) { edges_dup[a].push_back((int) edgelist.size()); edgelist.push_back(edge_s(a, b, c, 0)); edges_dup[b].push_back((int) edgelist.size()); edgelist.push_back(edge_s(b, a, 0, 0)); } void find_cut() { freopen("cut_min.txt", "w", stdout); // output file dis.resize(2 * V, 0); ptr.resize(2 * V, 0); edges_dup.resize(2 * V, vector<int>(0)); const int top = min(10, V); for (int i = 0; i < V; i++) top_flow.push_back(make_pair(0, i)); for (int i = 0; i < V; i++) { top_degree.push_back(make_pair(edge[i].size(), i)); for (int j = 0; j < edge[i].size(); j++) { int to = edge[i][j]; dinic_addedge(i, to + V, V); } dinic_addedge(i + V, i, 1); } stable_sort(top_degree.rbegin(), top_degree.rend()); cout << "Minimum cut between characters:" << endl; for (int i = 0; i < top; i++) { for (int j = i + 1; j < top; j++) { vector<int>::iterator p = find(edge[top_degree[i].second].begin(), edge[top_degree[i].second].end(), top_degree[j].second); if (p != edge[top_degree[i].second].end()) continue; int flow = dinic_flow(top_degree[i].second, top_degree[j].second + V); cout << name[top_degree[i].second] << " -> " << name[top_degree[j].second] << " = " << flow << endl; for (int k = 0; k < edgelist.size(); k++) { if ((edgelist[k].a == (edgelist[k].b + V)) && (edgelist[k].flow == 1)) { top_flow[edgelist[k].b].first++; } edgelist[k].flow = 0; } } } stable_sort(top_flow.rbegin(), top_flow.rend()); cout << endl << "Top involved characters in the flows:" << endl; for (int i = 0; i < top; i++) { cout << name[top_flow[i].second] << " (" << top_flow[i].first << ")" << endl; } }
ããã ãã§ãçµè«ãšããŠãTyrion Lannisterã¯ç座ã®äžçã§éåžžã«éèŠãªãã£ã©ã¯ã¿ãŒã§ããããšã«æ³šæããããšãã§ããŸãããã®èšäºãããªãã«ãšã£ãŠèå³æ·±ããã®ã§ãããããããæçšã§ããããšãé¡ã£ãŠããŸãããã¹ãŠã®ã¢ã«ãŽãªãºã ã®ãœãŒã¹ã³ãŒããGitHubã«ãããŸãïŒä»¥äžã®ãªã³ã¯ïŒã
åç §ïŒ
GitHubãããžã§ã¯ã
ãããžã§ã¯ããéãããšãã§ããå ã®ãœãŒã·ã£ã«ã°ã©ãGephi
ããã°ã©ã èŠåºãã®åçã®èè -Adam FosteræåŸã«ãçŽæãããããã«ãã¢ã³ã±ãŒãïŒæ¬ã®ãã€ã¢ãã°ã®èè ãã©ã®ããã«æ±ºå®ããããã«ã€ããŠã®èšäºã翻蚳ãã䟡å€ã¯ãããŸããïŒ