zoj 3583
2012-03-11 23:39
316 查看
两种做法
1:
本来想的是枚举每个点u,从s搜到u,再从t搜到u,如果两条路径只有u这一个公共点,则u可以在简单路径上,后来举出了一个反例就推翻掉了,囧。。。。。。
但现在发现这个想法是下一个想法的铺垫。
模型是:是否存在s->u的一条路径与t->u的另一条路径只有u这一个交点
单纯的搜索很难弄,比如广搜,搜到的路径都是最短路径,很容易就可以举出反例推翻掉。
举个例子:
先发一张比较挫的图片
View Code
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); } }
相关文章推荐
- zoj 3583 Simple Path
- 【dfs找不在简单路径的点】ZOJ 10th Anniversary Contest C ZOJ 3583
- ZOJ 3583 Simple Path[并查集]
- zoj 3583
- zoj 3583 simple path
- zoj 1610
- zoj 3349 dp + 线段树优化
- zoj - 3209 - Treasure Map(精确覆盖DLX)
- UVa 318 - Domino Effect(zoj 1298)
- ZOJ_3501 Roman Order
- ZOJ 3686 A Simple Tree Problem
- zoj 3041 City Selection
- ZOJ-3781-Paint the Grid Reloaded 缩点+建图+spfa
- zoj 3175 Number of Containers
- TOJ 3365 ZOJ 3232 It's not Floyd Algorithm / 强连通分量
- ZOJ-3132-DNA Consensus String
- ZOJ 3770 Ranking System
- ZOJ 1457Prime Ring Problem
- ZOJ 3332 Strange Country II 判断有向图联通
- zoj 3487 Ordinal Numbers