hdu 4738 Caocao's Bridges(双联通)
来源:互联网 发布:php hadoop 编辑:程序博客网 时间:2024/05/22 05:03
一个无向图 炸一个桥 使无向图分成两个以上部分 问所炸桥的最小权值 。
#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>#include<map>using namespace std;#define ma_pa(a,b) make_pair(a,b)#define clr(x) memset(x,0,sizeof(x))#define maxn 2010#define maxm 2100000#define INF 0x1f1f1f1fstruct node{ int to,next;}e[maxm],e2[maxm];int head[maxn],tot;int head2[maxn],tot2;int col[maxn],dfn[maxn],low[maxn],sta[maxn];int top,ti,scc; //scc 双联通分支个数int n,m;bool vis[maxn];void init(){ memset(head,-1,sizeof(head)); clr(vis); clr(dfn); tot=0; top=0; scc=ti=0;}void add(int u,int v){ e[tot].to=v; e[tot].next=head[u]; head[u]=tot++;}void tarjan(int u,int fa){ dfn[u]=low[u]=++ti; sta[++top]=u; vis[u]=true; int cnt=0; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(!dfn[v]){ tarjan(v,u); low[u]=min(low[u],low[v]); } else if(fa==v){ if (cnt) low[u] = min(low[u],dfn[v]);//重边 cnt++; } else if(vis[v])low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]){ int x; scc++; do{ x = sta[top--]; vis[x]=false; col[x] = scc; }while(x!=u); }}int father[4010];int find(int x){ if(father[x]==x)return x; return father[x]=find(father[x]);}bool join(int x,int y){ x=find(x); y=find(y); if(x==y)return false; if(x>y){father[x]=y;} if(x<y){father[y]=x;} return true;}struct node1{ int x,y;}road[2100000];int main(){ int u,v,w,i; while(scanf("%d%d",&n,&m)!=EOF){ init(); map<pair<int,int>,int>mp; mp.clear(); for(i=0;i<=n;i++){ father[i]=i; } if(n==0&&m==0)break; int ppp=INF; for(int i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&w); if(v==u)continue; add(u,v); add(v,u); join(u,v); ppp=min(ppp,w); if(mp[ma_pa(u,v)]==0){ mp[ma_pa(u,v)]=w; mp[ma_pa(v,u)]=w; } else { mp[ma_pa(u,v)]=min(mp[ma_pa(u,v)],w); mp[ma_pa(v,u)]=mp[ma_pa(u,v)]; } } int fff=0; for(i=1;i<=n;i++){ if(find(i)!=1)fff=1; } if(fff){printf("0\n");continue;} tarjan(1,-1); if(scc==0){ printf("%d\n",ppp); continue; } if(scc==1){ printf("-1\n"); continue; } int res=INF; for(int i = 1; i <= n; i++){ for(int j = head[i]; j!=-1; j = e[j].next){ int v = e[j].to; if(col[i]!=col[v]){ res=min(res,mp[ma_pa(i,v)]); } } } if(res==0)printf("1\n"); else printf("%d\n",res); } return 0;}
- hdu 4738 Caocao's Bridges(双联通)
- HDU 4738 Caocao's Bridges(双联通分量+并查集)
- HDU 4738 Caocao's Bridges(找割边)
- HDU 4738 Caocao's Bridges(找无向图的桥 双联通)
- hdu 4738 Caocao's Bridges
- hdu 4738 Caocao's Bridges
- hdu 4738 Caocao's Bridges
- HDU:4738 Caocao's Bridges
- HDU 4738 Caocao's Bridges
- HDU 4738 Caocao's Bridges
- hdu 4738 - Caocao's Bridges
- hdu 4738 Caocao's Bridges
- HDU-4738Caocao's Bridges
- HDOJ 题目4738 Caocao's Bridges(双联通,求桥)
- HDU Caocao's Bridges
- Caocao's Bridges HDU
- HDU 4738 --Caocao's Bridges 【无向图边双联通 && 求权值最小的桥 && 模板】
- hdu 4738 Caocao's Bridges 割边无敌(trick)
- How to think like a Computer Scientist: 课后习题第十八章1
- PCQQ2013 0828涉及到的CRC校验算法[.net
- 亚马逊面试题2(二叉树)
- 一个抽奖函数(自定义中奖项数和概率)
- MFC窗口的关闭过程
- hdu 4738 Caocao's Bridges(双联通)
- PCQQ加密类Tea算法[最新版本兼容]
- python批量删除数据库触发器
- ASCII码表
- php使用mysql扩展库链接mysql数据库(查询)
- servlet与jsp的传值方法(个人手写)
- CoIDE下UCos-II在STM32下的移植
- 笔记本开启laptop mode,来降低温度
- 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系