比赛 |
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;
}