| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
C++ WA G++ AC 求解释#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define maxn 1010
#define maxm 1000009
bool map[maxn][maxn];
int min(int a, int b) {return a < b ? a : b;}
struct E
{
int v, next;
}edge[maxm<<3];
int head[maxn], tot;
int n, m;
void add(int s, int t)
{
edge[tot].v = t;
edge[tot].next = head[s];
head[s] = tot++;
edge[tot].v = s;
edge[tot].next = head[t];
head[t] = tot++;
}
int stack[maxn], top;
int dfn[maxn], low[maxn];
int num, id;
vector<int> ans[maxn];
void dfs(int u, int fa)
{
int i;
low[u] = dfn[u] = ++id;
stack[++top] = u;
for(i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(v == fa) continue;
if(!dfn[v])
{
dfs(v, u);
low[u] = min(low[u], low[v]);
if(dfn[u] <= low[v])
{
ans[num].push_back(u);
while(1)
{
int w = stack[top--];
ans[num].push_back(w);
if(w == v) break;
}
if(ans[num].size()<=2) ans[num].clear();
else num++;
}
}
else low[u] = min(low[u], dfn[v]);
}
}
int col[maxn];
bool color(int u, int fa, int k)
{
int i;
for(i = 0; i < ans[k].size(); i++)
{
int y = ans[k][i];
if(fa == i || !map[ans[k][u]][y]) continue;
if(col[i] == -1)
{
col[i] = 1^col[u];
if( color(i, u, k) ) return 1;
}
else if(col[i] == col[u]) return 1;
}
return 0;
}
bool vis[maxn];
void solve()
{
num = 0; top = 0;
memset(dfn, 0, sizeof(int)*(n+1));
int i;
for(i = 1; i <= n; i++)
if(!dfn[i]) { id = 0; dfs(i, -1); }
memset(vis, 0, sizeof(int)*(n+1));
for(i = 0; i < num; i++)
{
memset(col, -1, sizeof(int)*(n+1));
col[0] = 1;
if(color(0, -1, i))
{
for(int x = 0; x < ans[i].size(); x++)
vis[ans[i][x]] = 1;
}
}
int cnt = 0;
for(i = 1; i <= n; i++)
if(!vis[i]) cnt++;
printf("%d\n", cnt);
}
int main()
{
int i, j;
while( ~scanf("%d%d", &n, &m) && n || m)
{
for(i = 0; i <= n; i++)
for(j = 0; j <= n; j++)
map[i][j] = 1;
int x, y;
for(i = 0; i <= n; i++)
{
ans[i].clear();
map[i][i] = 0;
}
while(m--)
{
scanf("%d%d", &x, &y);
map[x][y] = map[y][x] = 0;
}
memset(head, -1, sizeof(int)*(n+1));
tot = 0;
for(i = 1; i <= n; i++)
for(j = i+1; j <= n; j++)
if(map[i][j]) add(i, j);
solve();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator