POJ 1523 解题报告

来源:互联网 发布:60数据库 编辑:程序博客网 时间:2024/05/17 02:32

这道题刚开始看是求割点,还不知道割点算法,以为很难,然后看到是我大纽约的题之后就放心了。暴力做就好了。果然一次提交就顺利过了。想到可能点编号不连续,写起来稍微麻烦点。另外就是知道了c++中传array引用的方法。见http://stackoverflow.com/questions/5724171/passing-an-array-by-reference

void Func(int (&myArray)[100])

Pass array of 100 int by reference the parameters name is myArray;

thestoryofsnow1523Accepted188K0MSC++2690B
/* ID: thestor1 LANG: C++ TASK: poj1523 */#include <iostream>#include <fstream>#include <cmath>#include <cstdio>#include <cstring>#include <limits>#include <string>#include <vector>#include <list>#include <set>#include <map>#include <queue>#include <stack>#include <algorithm>#include <cassert>using namespace std;const int MAXN = 1000;class Edge{public:int v;Edge *next;Edge(): v(-1), next(NULL) {}Edge(int v): v(v), next(NULL) {}};int map2id(int ni, int mapping[], int rmapping[], int &node_id){// map from input (ni) to node_id// reverse mapping (rmapping) is also needed for outputni--;if (mapping[ni] < 0){mapping[ni] = node_id;rmapping[node_id] = ni + 1;node_id++;}return mapping[ni];}void addEdge(int ni, int nj, Edge* (&adjs)[MAXN]){Edge* e = new Edge(nj);e->next = adjs[ni];adjs[ni] = e;}void addEdges(int ni, int nj, int mapping[], int rmapping[], int &node_id, Edge* (&adjs)[MAXN]){ni = map2id(ni, mapping, rmapping, node_id);nj = map2id(nj, mapping, rmapping, node_id);addEdge(ni, nj, adjs);addEdge(nj, ni, adjs);}void dfs(int u, const int node, Edge* adjs[], bool (&visited)[MAXN]){visited[u] = true;Edge *e = adjs[u];while (e != NULL){int v = e->v;if (v != node && !visited[v]){dfs(v, node, adjs, visited);}e = e->next;}}int main(){int network_id = 1;int mapping[MAXN], rmapping[MAXN];Edge* adjs[MAXN];bool visited[MAXN];while (true){memset(mapping, -1, sizeof(int) * MAXN);for (int i = 0; i < MAXN; ++i){adjs[i] = NULL;}int node_id = 0;int ni, nj;scanf("%d", &ni);if (ni == 0){break;}scanf("%d", &nj);addEdges(ni, nj, mapping, rmapping, node_id, adjs);while (scanf("%d", &ni) && ni){scanf("%d", &nj);addEdges(ni, nj, mapping, rmapping, node_id, adjs);}printf("Network #%d\n", network_id);// printf("[debug]graph(%d):\n", node_id);// for (int i = 0; i < node_id; ++i)// {// printf("%d: ", i);// Edge *e = adjs[i];// while (e != NULL)// {// printf("%d ", e->v);// e = e->next;// }// printf("\n");// }bool nosubnet = true;for (int u = 0; u < node_id; ++u){memset(visited, false, sizeof(bool) * node_id);int nsubnets = 0;for (int v = 0; v < node_id; ++v){if (v == u || visited[v]){continue;}nsubnets++;dfs(v, u, adjs, visited);}if (nsubnets > 1){nosubnet = false;printf("  SPF node %d leaves %d subnets\n", rmapping[u], nsubnets);}}if (nosubnet){printf("  No SPF nodes\n");}printf("\n");network_id++;}return 0;  }



0 0
原创粉丝点击