Ranking (as of 2015-05-22): 131 out of 308
Language: C++
/*
UVa 10973 - Triangle Counting
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10973_Triangle_Counting.cpp
*/
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
const int n_max = 3000;
vector<int> edges[n_max + 1];
bool matrix[n_max + 1][n_max + 1];
void triangle_counting(int n, int ci, int ei, int t[], int& ctr)
{
if (ci == 2) {
#ifdef DEBUG
printf("%d %d %d\n", t[0], t[1], ei);
#endif
if (matrix[t[0]][ei])
ctr++;
}
else {
t[ci] = ei;
const vector<int>& es = edges[ei];
for (size_t i = 0, j = es.size(); i < j; i++)
triangle_counting(n, ci + 1, es[i], t, ctr);
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
edges[i].clear();
for (int j = i + 1; j <= n; j++)
matrix[i][j] = matrix[j][i] = false;
}
while (m--) {
int i, j;
scanf("%d %d", &i, &j);
if (i > j)
swap(i, j);
edges[i].push_back(j);
matrix[i][j] = matrix[j][i] = true;
}
for (int i = 1; i <= n; i++)
sort(edges[i].begin(), edges[i].end());
int t[2], ctr = 0;
for (int i = 1; i <= n; i++) {
t[0] = i;
const vector<int>& es = edges[i];
for (size_t j = 0, k = es.size(); j < k; j++)
triangle_counting(n, 1, es[j], t, ctr);
}
printf("%d\n", ctr);
}
return 0;
}
No comments:
Post a Comment