您的位置:首页 > 其它

【TOJ】2299【POJ】2117.Electricity

2010-07-11 13:47 357 查看
写了一晚上+一上午,WA了13次终于过了!


题意为:给一个无向图,问删除某点最多能形成连通分量的个数

这里有篇学长的解题报告,写得很不错:http://hi.baidu.com/flabbyan/blog/item/ee10e3e68bb4ad27b8382009.html

最后我套用的上交模板:

Show Code - Run ID 926870

Submit Time:
2010-07-11 12:46:00
Language:
GNU C++
Result:
Accepted

Pid:
2299

Time:
0.38 sec.
Memory:
2260 K.
Code Length:
1.7 K.

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<limits.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10001;
int n,mk[maxn],d[maxn],low[maxn],m,cut[maxn],MAX;
//cut[u]为非根点u被删除时增加的连通分量
vector<int> g[maxn];//改成邻接表了,邻接矩阵MLE
int color,ti,cutvertexnum,cutvertexlist[maxn];
void dfsvisit( int u , int p){
int v,s=0,bVertex=0; low[u]=d[u]=++ti ; mk[u]=-color ;
for ( v=0; v<g[u].size() ; v++)
if ( g[u][v] !=p)
if (mk[g[u][v]]==0){
dfsvisit(g[u][v],u); s++;
if ( low [g[u][v]]<low [u] ) low[u]=low[g[u][v]] ;
if ( low [g[u][v]]>=d[u] ) {bVertex=1;cut[u]++;}
}
else if (d [g[u][v]]<low[u] ) low[u]=d[g[u][v]] ;
if ( ( p && bVertex) || ( !p&& s >1) )
cutvertexlist[cutvertexnum++]=u ;
mk[u]= color ;
if(p==0) MAX>?=s-1;//s为u在dfs树中儿子的个数
else MAX>?=cut[u];//p为0则u为根
}
void dfs(){
int i , j , k ;
memset (mk,0,sizeof(mk)) ;
memset (cut,0,sizeof(cut)) ;
color=ti=cutvertexnum=MAX=0;//color为连通分量个数
for ( i=1; i<=n ; i++) if(!mk[i]){++color; dfsvisit(i,0);}
printf("%d/n",color+MAX);
}
int main(){
int i,j,a,b;
while(scanf("%d%d",&n,&m),n||m){
if(m==0){
//m=0时每个点是一个连通分量,删掉某一点相当于删掉了一个联连通分量
printf("%d/n",n-1);
continue;
}
for(i=1;i<=n;i++){
g[i].clear();
}
while(m--){
scanf("%d%d",&a,&b);
g[a+1].push_back(b+1);//a和b加1为模板需要~
g[b+1].push_back(a+1);
}
dfs();
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: