Hdu4370 0 or 1 最短路径spfa
来源:互联网 发布:济宁广电网络客服电话 编辑:程序博客网 时间:2024/05/22 06:04
题意:一个n*n的01矩阵,满足以下条件
1.X12+X13+...X1n=1
2.X1n+X2n+...Xn-1n=1
3.for each i (1<i<n), satisfies ∑Xki (1<=k<=n)=∑Xij (1<=j<=n).
另给出一个矩阵C,求∑Cij*Xij(1<=i,j<=n)的最小值。
此题非常厉害,就算法来说不是很难,但很考想法。这题的精髓在于如何将条件抽象出来,并建图。
三个条件分别告诉我们 点1的出度为1,点n的入度为1,每个点的入度等于出度,这样就可以构图了。设n各点,将∑Cij*Xij(1<=i,j<=n)看成n各点的邻接矩阵。这时问题分成了两种情况。
第一种是求1到n的最短路径,第二种是求1到1的非自环闭环 + n到n的非自环闭环的和。比较这两种情况,取最小的值为解。
用spfa时设d[s]的值为INF,让d[s]的相邻节点入栈,这样保证了可以取到非自环闭环。
#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#define INF 0x7fffffff#define N 550using namespace std;int d[N],v[N],n,a[N][N],q[N];int spfa(int s,int t){ for(int i=1;i<=n;i++) d[i]=INF,v[i]=0; int cnt=0; for(int i=1;i<=n;i++) if(i!=s) { d[i]=a[s][i]; q[cnt++]=i; v[i]=1; } while(cnt>=0) { int c=q[--cnt]; v[c]=0; for(int i=1;i<=n;i++) if(d[i]>d[c]+a[c][i]) { d[i]=d[c]+a[c][i]; if(!v[i]) v[i]=1,q[cnt++]=i; } } return d[t];}int main(){ while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); int ans=min(spfa(1,n),spfa(1,1)+spfa(n,n)); cout<<ans<<endl; }}
2 0
- Hdu4370 0 or 1 最短路径spfa
- hdu4370 0 or 1 最短路
- 0 or 1 HDU4370 最短路
- hdu4370 0 or 1
- HDU4370 0 or 1 神转换,最短路
- hdu4370题解(0 or 1)
- spfa最短路径
- 最短路径spfa
- spfa 最短路径
- 最短路径 -- spfa
- SPFA最短路径
- SPFA--最短路径
- 最短路径算法---SPFA
- 最短路径----SPFA算法
- 最短路径之 SPFA
- 【最短路径】SPFA算法
- SPFA算法【最短路径】
- SPFA最短路径模板
- 画表格
- 点击 UITextField 清除按钮,文本框中内容清除
- 1015. Reversible Primes (20)
- 蓝桥杯:龟兔赛跑预测
- 排序算法之希尔排序
- Hdu4370 0 or 1 最短路径spfa
- POJ 3187 Backward Digit Sums
- linux下echo命令详解
- 总是忘记去哪找自己在CSDN上提问的问题
- E - A rectangle
- 简化MongoAPI第二部分--MongoTemplate
- Python中关于try/except/finally的基础用法
- Spring学习笔记之IoC容器
- hdu 2191 多重背包裸题(留个模板)