hdu 4738(双联通缩点)
来源:互联网 发布:日本知乎 编辑:程序博客网 时间:2024/06/05 06:19
此题有坑!!!
桥的边权有可能是0,但是这时候要输出1,因为周瑜至少的排一个人去炸呀,那个年代又没有导弹!!!卧槽,有时候还得联系实际!
#include<cstdio>#include<algorithm>#include<cstring>#include<stack>#include<vector>using namespace std;const int inf = 1<<20;const int maxn = 1005;int n,m;struct node{ int to; int next; int w; node(){} node(int a,int b,int c):to(a),next(b),w(c){}}edge[1002*1002];struct Edge{ int to; int w; Edge(int a,int b):to(a),w(b){}};vector<Edge>G[maxn];int head[maxn],dfn[maxn],low[maxn],belong[maxn];int tot,ti,cnt;stack<int>s;void tarjan(int u,int fa){ dfn[u] = ++ti; low[u] = ti; s.push(u); int flag = 0; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].to; if(v==fa&&flag==0){flag=1;continue;} if(!dfn[v]) { tarjan(v,u); low[u] = min(low[u],low[v]); } else if(belong[v]==-1) { low[u] = min(dfn[v],low[u]); } } if(dfn[u]==low[u]) { int y; cnt++; do{ y = s.top(); s.pop(); belong[y] = cnt; }while(y!=u); }}int res;void dfs(int u,int fa){ int len = G[u].size(); for(int i=0;i<len;i++) { int v = G[u][i].to; if(v==fa) continue; res = min(res,G[u][i].w); dfs(v,u); }}void cbh(int u){ dfn[u] = 1; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].to; if(!dfn[v]) { dfn[v] = 1; cbh(v); } }}int main(){ int u,v,w; while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; tot = 0; memset(head,-1,sizeof(head)); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); if(u==v) continue; edge[tot] = node(v,head[u],w); head[u] = tot++; edge[tot] = node(u,head[v],w); head[v] = tot++; } int key = 0; memset(dfn,0,sizeof(dfn)); for(int i=1;i<=n;i++) { if(!dfn[i]){key++;cbh(i);} } if(key>1){printf("0\n");continue;} memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(belong,-1,sizeof(belong)); ti = 0; cnt = 0; for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,-1); if(cnt==1) {printf("-1\n"); continue; } for(int i=1;i<=n;i++) G[i].clear(); for(int i=1;i<=n;i++) { for(int j=head[i];j!=-1;j=edge[j].next) { if(belong[i]!=belong[edge[j].to]) { G[belong[i]].push_back(Edge(belong[edge[j].to],edge[j].w)); } } } res = inf; dfs(1,-1); if(res==0) res++; printf("%d\n",res); } return 0;}
阅读全文
0 0
- hdu 4738(双联通缩点)
- hdu 5739(点双联通分量 )
- hdu 4612 双联通缩点+树形dp
- hdu 4612 Warm up (边双联通分量缩点)
- HDU 3394 Railway (点双联通+圈内判边数)
- HDU 1827 强联通缩点
- HDU 5739 点-双联通分量
- 点双联通+缩点+LCA(HDU3686)
- HDU 4738 双联通分量
- hdu4612Warm up(双联通缩点+树直径)
- hdu4612(双联通缩点+求树的直径)
- HDU 6165 FFF at Valentine (tarjan缩点+拓扑判任意两点联通)
- hdu 3836 Equivalent Sets 强联通 tarjan缩点
- HDU 2767-Proving Equivalences(强联通+缩点)
- Proving Equivalences (hdu 2767 强联通缩点)
- Summer Holiday (hdu 1827 强联通缩点)
- Intelligence System (hdu 3072 强联通缩点+贪心)
- HDU 3072 Intelligence System 贪心+强联通缩点
- 指令 AngularJs
- JSTL fn 标签库
- 解决There is no Action mapped for namespace for****异常
- 文章标题 POJ 1182 : 食物链 (带权并查集)
- 一个简单的C++程序(给17级新生的入门引导)
- hdu 4738(双联通缩点)
- Unity 实现鼠标拖拽查看地图
- 计算机网络:什么是套接字(Socket)?
- 阿里云服务器linux环境,从启动tomcat服务器外网访问--->绑定域名--->Navicat远程连接mysql--->阿里云服务器部署项目过程中,一定会遇到的五大问题;
- bzoj1597 [Usaco2008 Mar]土地购买(变形+斜率优化)
- 本地SQL查询
- Android——将每三个数字加上逗号处理(通常使用金额方面的编辑)
- 数据结构 -- 链表&双向链表
- 二维码识别之Android完整编译Zbar