| ||||||||||
| 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 | |||||||||
2942wa求高人debug谢谢#include <cstdlib>
#include <map>
#include <set>
#include <string>
#include <stdio.h>
#include <ctype.h>
#include <iostream>
#include <fstream>
#include <math.h>
#include <sstream>
#include <vector>
#include <functional>
#include <algorithm>
#include <stack>
#include <queue>
using namespace::std;
const int maxN = 1000 + 10;
const int maxM = 1000000 + 10;
bool edge[maxN][maxN], del[maxN], inSt[maxN];
int rEdge[maxN][maxN];
int N, M, ans, dfn[maxN], low[maxN], mCount, colour[maxN];
void mClear(){
memset(edge, true, sizeof(edge));
memset(rEdge, 0, sizeof(rEdge));
memset(del, true, sizeof(del));
memset(dfn,0,sizeof(dfn) );
}
struct ed{
int u, v;
ed(){
}
ed(int x, int y){
u = x;
v = y;
}
};
stack<ed> mStack;
bool isOk(int index){
int c = 0;
queue<int> myQ;
myQ.push(index);
bool qVis[maxN];
memset(qVis, false, sizeof(qVis));
while (!myQ.empty()){
int cur = myQ.front();
myQ.pop();
qVis[cur] = true;
c= c^1;
colour[cur]=c;
for (size_t i = 1; i <= rEdge[cur][0]; i++)
{
int v = rEdge[cur][i];
if (inSt[v]){
if (colour[v] == colour[cur])return true;
if (!qVis[v]){
myQ.push(v);
}
}
}
}
return false;
}
void check(int u, int v){
memset(colour, -1, sizeof(colour));
memset(inSt, false, sizeof(inSt));
ed t;
do{
t=mStack.top();
mStack.pop();
inSt[t.u] = true; inSt[t.v] = true;
} while (t.u!=u&&t.v!=v);
if (isOk(t.u)){
for (size_t i = 1; i <= N; i++)
{
if (inSt[i]){
del[i] = false;
}
}
};
}
void dfs(int fa, int index){
dfn[index] = low[index] = mCount++;
for (size_t i = 1; i <= rEdge[index][0]; i++)
{
int v = rEdge[index][i];
if (v == fa)continue;
mStack.push(ed(index,v));
if (!dfn[v]){
dfs(index,v);
low[index] = min(low[index], low[v]);
if (low[v] >= dfn[index]){
check(index,v);
}
}
else if (dfn[v] < low[index]){
low[index] = dfn[v];
}
}
}
int main(){
while (scanf("%d%d", &N, &M) && N != 0){
mCount = 1;
mClear();
for (size_t i = 0; i < M; i++)
{
int u, v;
scanf("%d%d", &u, &v);
edge[u][v] = false;
edge[v][u] = false;
}
for (size_t i = 1; i <= N; i++)
{
for (size_t j = 1; j <= N; j++){
if (edge[i][j]&&i!=j){
rEdge[i][0]++;
int con = rEdge[i][0];
rEdge[i][con] = j;
}
}
}
for (size_t i = 1; i <= N; i++)
{
if (!dfn[i])dfs(i,i);
}
int ans = 0;
for (size_t i = 1; i <= N; i++)
{
if (del[i])ans++;
while (!mStack.empty()){
mStack.pop();
}
}
cout << ans << endl;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator