Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:有人能用正确程序生成一些数据吗,错了很多遍就是不过...谢...

Posted by mabaochang at 2009-08-03 10:10:36 on Problem 2942
In Reply To:有人能用正确程序生成一些数据吗,错了很多遍就是不过...谢... Posted by:mabaochang at 2009-08-03 09:31:36
> #include<iostream>
using namespace std;
struct pp{
	int x,y;
};
pp s[1000002];
pp tem[1000002];
int top;
int g[1002][1002];
int low[1002];
int d[1002];
int n,m;
int B;
bool block[1002][1002];
int num=0;
int color[1002];
bool used[1002];
int tt;
void init(){
	int i,j;
	int a,b;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			g[i][j]=1;
			block[i][j]=false;
		}
	}
	for(i=1;i<=n;i++){
		g[i][i]=-1;
	}
	for(i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		g[a][b]=-1;
		g[b][a]=-1;
	}
	for(i=1;i<=n;i++){
		d[i]=-1;
		color[i]=-1;
		used[i]=false;
	}
	top=1;
	B=0;
	num=0;
}
void dfs(int now,int p){
	low[now]=d[now]=num++;
	int i;
	for(i=1;i<=n;i++){
		if(g[now][i]==-1){
			continue;
		}
		if(i!=p&&d[i]<d[now]){
			s[top].x=now;
			s[top].y=i;
			top++;
		}
		if(d[i]<0){
			dfs(i,now);
			low[now]=low[now]<low[i]? low[now]:low[i];
			if(low[i]>=d[now]){
				int j=0;
				pp key;
				do{
					key=s[--top];
					j++;
					tem[j]=key;
				}while(!(key.x==now&&key.y==i));
				if(j>2){
					B++;
					int k;
					for(k=1;k<=j;k++){
						block[B][tem[k].x]=true;
						block[B][tem[k].y]=true;
					}
				}
			}
		}
		else{
			if(i!=p){
				low[now]=low[now]<d[i]? low[now]:d[i];
			}
		}
	}
}
bool dfsc(int now,int c,int b){
	int i;
	color[now]=c;
	for(i=1;i<=n;i++){
		if(g[now][i]==-1||!block[b][i]){
			continue;
		}
		if(color[i]==-1){
			if(!dfsc(i,1-c,b)){
				return false;
			}
		}
		else{
			if(color[i]==c){
				return false;
			}
		}
	}
	return true;
}
void cal(){
	int i,j;
	for(i=1;i<=n;i++){
		if(d[i]==-1){
			dfs(i,-1);
		}
	}
	int ans=0;
	for(i=1;i<=B;i++){
		int ok;
		for(j=1;j<=n;j++){
			if(block[i][j]){
				ok=dfsc(j,0,i);
				break;
			}
		}
		if(!ok){
			for(j=1;j<=n;j++){
				if(block[i][j]){
					used[j]=true;
				}
			}
		}
	}
	for(i=1;i<=n;i++){
		if(!used[i]){
			ans++;
		}
	}
	cout<<ans<<endl;
}
int main(){
	//freopen("a1.in","r",stdin);
	//freopen("in.txt","w",stdout);
	while(cin>>n>>m&&!(n==0&&m==0)){
		init();
		cal();
	}
	return 0;
}

PS:贴代码,自己顶一下

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator