比赛 20120711 评测结果 AAAAWWAAWWWWAAAAW
题目名称 Redundant Paths 最终得分 58
用户昵称 QhelDIV 运行时间 0.026 s
代码语言 C++ 内存使用 0.55 MiB
提交时间 2012-07-11 11:58:54
显示代码纯文本
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fin("rpathsa.in");
ofstream fout("rpathsa.out");
int F,R,Color[6000],Cn,Bn,degree[6000],target,A[6000],deep[6000];
bool visited[6000];
string S[6000];
class Node
{
public:
	int Name;bool del;
	Node *Prev,*next;
	Node()
	{
		del=false;
	}
}*last[6000],*nlast[6000];
class Bridge
{
public:
	Node *rec;
	int from,to;
}bridge[6000];
void ADD(int u,int v)
{
Node *p=new Node;
	p->Name=v;
	p->Prev=last[u];
	if(last[u])
		last[u]->next=p;
	last[u]=p;
	last[u]->next=NULL;
}

void Initialize()
{
int i,U,V;
	fin>>F>>R;
	for(i=1;i<=F;i++)
	{
		S[i]="White";
		last[i]=NULL;
	}
	for(i=1;i<=R;i++)
	{
		fin>>U>>V;
		ADD(U,V);
		ADD(V,U);
	}
}

void Floodfill(int pos)
{
Node *p;
	for(p=last[pos];p;p=p->Prev)
		if(!visited[p->Name] && !p->del)
		{
			visited[p->Name]=true;
			Color[p->Name]=Cn;
			Floodfill(p->Name);
		}
}

void nAdd(int u,int v)
{
Node *p=new Node;
	p->Name=v;
	p->Prev=last[u];
	nlast[u]=p;
}

void MakeNew()
{
int i;
	for(i=1;i<=Cn;i++)
		nlast[i]=NULL;
	for(i=1;i<=Bn;i++)
	{
		nAdd(Color[bridge[i].from],Color[bridge[i].to]);
		nAdd(Color[bridge[i].to],Color[bridge[i].from]);
		degree[Color[bridge[i].from]]++;
		degree[Color[bridge[i].to]]++;
	}
}
void Fin()
{
int i;
	for(i=1;i<=Cn;i++)
		if(degree[i]<=1)
			target++;
}
void GetBridge(int pos,int d,int father)
{
Node *p;int tot=0;
d++;
S[pos]="Gray";
	deep[pos]=d;A[pos]=d;
	for(p=last[pos];p;p=p->Prev)
		if(p->Name!=father)
		{
			if(S[p->Name]=="Gray")
				A[pos]=min(A[pos],deep[p->Name]);
			if(S[p->Name]=="White")
				GetBridge(p->Name,d,pos);
			
			tot++;A[pos]=min(A[pos],A[p->Name]);
			if(A[p->Name]>deep[pos])
			{
				Bn++;
				bridge[Bn].rec=p;
				bridge[Bn].from=pos;
				bridge[Bn].to=p->Name;
				p->del=true;
			}
		}
S[pos]="Black";
}

void Solve()
{
int i;
	GetBridge(1,0,0);
	Cn=1;
	for(i=1;i<=F;i++)
		if(!visited[i])
		{
			visited[i]=true;
			Color[i]=Cn;
			Floodfill(i);
			Cn++;
		}
	MakeNew();
	Fin();
	fout<<(target+1)/2<<endl;
}

int main()
{
	Initialize();
	
	Solve();
	
	fin.close();
	fout.close();
	return 0;
}