博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Caocao's Bridges HDU - 4738
阅读量:5085 次
发布时间:2019-06-13

本文共 2564 字,大约阅读时间需要 8 分钟。

Caocao's Bridges

 
题意:一个带权无向图,破坏一条边的代价是权重,如果可以破坏一条边使得存在两点不能互达,输出最小代价。

 【找权值最小的桥】

找到桥更新答案即可。

注意如果本身图就不连通,则不需要破坏,代价为0

如果图不存在桥,则不满足输出-1

如果最后求出代价为0,则要输出1(因为题意是破坏桥,即使没有人守卫也要派一个人去炸桥)

1 #include 
2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxv=1000; 5 int n,m; 6 int ans; 7 struct Edge 8 { 9 int v,w,nex;10 }e[maxv*maxv<<1];11 int head[maxv];12 int cnt=0;13 void init()14 {15 memset(head,-1,sizeof(head));16 cnt=0;17 18 ans=inf;19 }20 void add(int u,int v,int w)21 {22 e[cnt].v=v;23 e[cnt].w=w;24 e[cnt].nex=head[u];25 head[u]=cnt++;26 }27 28 int pre[maxv],low[maxv],dfsk,bct;29 30 void Tarjin(int u,int id)31 {32 pre[u]=low[u]=++dfsk;33 for(int i=head[u];i!=-1;i=e[i].nex)34 {35 int v=e[i].v;36 if(i==(id^1)) continue; //反向边37 if(!pre[v])38 {39 Tarjin(v,i);40 low[u]=min(low[u],low[v]);41 if(low[v]>pre[u]&&ans>e[i].w) ans=e[i].w;42 }43 else low[u]=min(low[u],pre[v]);44 }45 }46 47 int main()48 {49 while(scanf("%d%d",&n,&m)&&(n||m))50 {51 init();52 int u,v,w;53 for(int i=0;i
1) ans=0;66 else if(ans==inf) ans=-1;67 else if(ans==0) ans=1;68 printf("%d\n",ans);69 70 71 }72 73 }
View Code

 不用low数组,用dfs返回low值慢一些

1 #include 
2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxv=1000; 5 int n,m; 6 int ans; 7 struct Edge 8 { 9 int v,w,nex;10 }e[maxv*maxv<<1];11 int head[maxv];12 int cnt=0;13 void init()14 {15 memset(head,-1,sizeof(head));16 cnt=0;17 18 ans=inf;19 }20 void add(int u,int v,int w)21 {22 e[cnt].v=v;23 e[cnt].w=w;24 e[cnt].nex=head[u];25 head[u]=cnt++;26 }27 28 int pre[maxv],dfsk,bct;29 30 int Tarjin(int u,int id)31 {32 int lowu=pre[u]=++dfsk;33 for(int i=head[u];i!=-1;i=e[i].nex)34 {35 int v=e[i].v;36 if(i==(id^1)) continue; //反向边37 if(!pre[v])38 {39 int lowv=Tarjin(v,i);40 lowu=min(lowu,lowv);41 if(lowv>pre[u]&&ans>e[i].w) ans=e[i].w;42 }43 else lowu=min(lowu,pre[v]);44 }45 return lowu;46 }47 48 int main()49 {50 while(scanf("%d%d",&n,&m)&&(n||m))51 {52 init();53 int u,v,w;54 for(int i=0;i
1) ans=0;66 else if(ans==inf) ans=-1;67 else if(ans==0) ans=1;68 printf("%d\n",ans);69 }70 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7390315.html

你可能感兴趣的文章
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>
HDU 5458 Stability
查看>>
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>
http://yusi123.com/
查看>>
文件文本的操作
查看>>
Ubuntu linux下gcc版本切换
查看>>
记一次Web服务的性能调优
查看>>
jQuery.form.js使用
查看>>
(转)linux sort,uniq,cut,wc命令详解
查看>>
关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)
查看>>
UVa540 Team Queue(队列queue)
查看>>
mysql数据增删改查
查看>>
shell中下载最新版本或指定版本的办法(Dockerfile 中通用)
查看>>
极客时间-左耳听风-程序员攻略-分布式架构工程设计
查看>>
akka之种子节点
查看>>
不知道做什么时
查看>>