Đề bài: http://vn.spoj.com/problems/REFORM/
Thuật toán:
- (đang cập nhập)
Code:
#include
#define FORE(i, a, b) for(int i = a; i <= b; i++)
#define FORD(i, a, b) for(int i = a; i >= b; i--)
#define FOR(i, a, b) for(int i = a; i < b; i++)
const int MAXN = 1e5 * 5;
const int INF = 1e9 + 7;
using namespace std;
int n, m;
bool a[50][50];
typedef pair ii;
vector< ii > s1, s2;
int dem;
bool Free[50];
inline void duyet(int u)
{
//cout< 0){
duyet(v);
}
}
vector< int > adj[MAXN];
int Low[MAXN], Num[MAXN], Count = 0, Pa[MAXN], C[MAXN];
inline void dfs(int u)
{
Count++;
Num[u] = Count;
Low[u] = n + 1;
C[u] = 1;
FOR(i, 0, adj[u].size()){
int v = adj[u][i];
if (Pa[v] == 0){
Pa[v] = u;
dfs(v);
C[u] += C[v];
Low[u] = min(Low[u], Low[v]);
} else
if (Pa[u] != v) Low[u] = min(Low[u], Num[v]);
}
}
long long sd[3];
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("REFORM.inp", "r", stdin);
freopen("REFORM.out", "w", stdout);
#endif //MIKELHPDATKE
cin >> n >> m;
if (n <= 20){
FORE(i, 1, m){
int x, y;
cin >> x >> y;
a[x][y] = 1;
a[y][x] = 1;
}
long long ans = 0;
FORE(x, 1, n) FORE(y, x + 1, n) if (a[x][y] == 1){
s2.push_back(ii(x, y));
} else s1.push_back(ii(x, y));
FOR(i, 0, s1.size())
FOR(j, 0, s2.size()){
int u1 = s1[i].first, v1 = s1[i].second;
int u2 = s2[j].first, v2 = s2[j].second;
a[u1][v1] = 1; a[v1][u1] = 1;
a[u2][v2] = 0; a[v2][u2] = 0;
memset(Free, 1, sizeof(Free));
dem = 0;
// cout<> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int dlt = 0;
FORE(u, 1, n) if (Pa[u] == 0){
Pa[u] = -1;
Count = 0;
dfs(u);
dlt++;
sd[dlt] = Count;
}
//cout< 2){
cout << 0 << endl;
return 0;
}
//FORE(u, 1, n) cout << C[u]<<" ";cout<
Recent Comments