您的位置:首页 > 其它

zoj 3583

2012-03-11 23:39 316 查看
两种做法

1:

本来想的是枚举每个点u,从s搜到u,再从t搜到u,如果两条路径只有u这一个公共点,则u可以在简单路径上,后来举出了一个反例就推翻掉了,囧。。。。。。

但现在发现这个想法是下一个想法的铺垫。

模型是:是否存在s->u的一条路径与t->u的另一条路径只有u这一个交点

单纯的搜索很难弄,比如广搜,搜到的路径都是最短路径,很容易就可以举出反例推翻掉。

举个例子:

先发一张比较挫的图片

View Code

#include<cstdio>
#include<cstring>
int g[110][110],fa[110],n;
void init(){
for(int i=0;i<=n;i++)    fa[i]=i;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unio(int a,int b){
int x=find(a);
int y=find(b);
if(x!=y) fa[x]=y;
}
int flag[110];
int main(){
int m,s,t;
int i,j,a,b,k;
while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF){
memset(g,0,sizeof(g));
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=1;
}
memset(flag,0,sizeof(flag));
int ans=0;
for(i=0;i<n;i++){
init();
for(j=0;j<n;j++)
for(k=j+1;k<n;k++)
if(i!=j&&i!=k&&g[j][k])
unio(j,k);
for(j=0;j<n;j++)
if(j!=i&&find(j)!=find(s) && find(j)!=find(t))
flag[j]=1;
}
for(i=0;i<n;i++)   if(flag[i])  ans++;
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: