POJ 1523問題解決報告
4397 ワード
この問題は最初に見たのですが、カットポイントの計算方法が分かりませんでした.難しいと思いました.そして、私の大ニューヨークの問題を見て安心しました.暴力でやればいいです.やはり一回の提出で無事に済みました.ポイント番号が不連続かもしれないと思いますが、書くのはちょっと面倒くさいです.また、c+++中伝array引用の方法が分かりました.お目にかかるhttp://stackoverflow.com/questions/5724171/passing-an-array-by-reference
thestoryofs now
1523
Acceepted
188 K
0 MS
C++
2690 B
void Func(int (&myArray)[100])
Pass array of 100 int by reference the parameters name is myAray;thestoryofs now
1523
Acceepted
188 K
0 MS
C++
2690 B
/*
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 output
ni--;
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
", network_id);
// printf("[debug]graph(%d):
", 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("
");
// }
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
", rmapping[u], nsubnets);
}
}
if (nosubnet)
{
printf(" No SPF nodes
");
}
printf("
");
network_id++;
}
return 0;
}