[spfa] hdu 4370 0 or 1
来源:互联网 发布:energia的编程语言 编辑:程序博客网 时间:2024/05/22 03:22
解题报告 from http://page.renren.com/601081183/note/866168965?null&ref=minifeed&sfet=2011&fin=1&ff_id=313179017&feed=page_reblog&tagid=1982941531&statID=page_601081183_2&level=3
1001 (已更新)
显然,题目给的是一个0/1规划模型。解题的关键在于如何看出这个模型的本质。
3个条件明显在刻画未知数之间的关系,从图论的角度思考问题,容易得到下面3个结论:
1.X12+X13+...X1n=1 于是1号节点的出度为1
2..X1n+X2n+...Xn-1n=1 于是n号节点的入度为1
3.∑Xki =∑Xij 于是2~n-1号节点的入度必须等于出度
于是3个条件等价于一条从1号节点到n号节点的路径,故Xij=1表示需要经过边(i,j),代价为Cij。Xij=0表示不经过边(i,j)。注意到Cij非负且题目要求总代价最小,因此最优答案的路径一定可以对应一条简单路径。
最终,我们直接读入边权的邻接矩阵,跑一次1到n的最短路即可,记最短路为path。
以上情况设为A
非常非常非常非常非常非常非常非常抱歉,简单路径只是充分条件,但不必要。(对造成困扰的队伍深表歉意)
漏了如下的情况B:
从1出发,走一个环(至少经过1个点,即不能是自环),回到1;从n出发,走一个环(同理),回到n。
容易验证,这是符合题目条件的。且A || B为该题要求的充要条件。
由于边权非负,于是两个环对应着两个简单环。
因此我们可以从1出发,找一个最小花费环,记代价为c1,再从n出发,找一个最小花费环,记代价为c2。(只需在最短路算法更新权值时多加一条记录即可:if(i==S) cir=min(cir,dis[u]+g[u][i]))
故最终答案为min(path,c1+c2)
/**[spfa] hdu 4370 真是一道好题,且不再吐槽hdu坑爹的数据。一道不知如何下手的题目活生生的转化为了最短路。其次要求两个环(1 -> 1,n -> n)同样spfa,处理一下初始条件(相当于添加一个虚拟点),d[1],d[n]即所要的值。*/#include <stdio.h>#include <string.h>#include <queue>#include <algorithm>using namespace std;#define N 333#define INF 100000000int mat[N][N],d[N];int vis[N],n;bool relax(int u,int v,int c){ if(d[u] + c < d[v]) { d[v] = d[u] + c; return 1; } return 0;}void spfa(int src){ int i,j,k; memset(vis,0,sizeof(vis)); queue<int> que; for(i = 1; i <= n; ++i) if(i == src) d[i] = INF; else { vis[i] = 1; d[i] = mat[src][i]; que.push(i); } while(!que.empty()) { i = que.front(); vis[i] = 0; que.pop(); for(j = 1; j <= n; ++j) { if(relax(i,j,mat[i][j]) && vis[j] == 0) vis[j] = 1,que.push(j); } }}int main(){ int i,j,x; while(scanf("%d",&n) == 1) { for(i = 1; i <= n; ++i) for(j = 1; j <= n; ++j) scanf("%d",&mat[i][j]); spfa(1); int ans = d[n],c1 = d[1]; spfa(n); ans = min(ans,c1 + d[n]); printf("%d\n",ans); } return 0;}
- [spfa] hdu 4370 0 or 1
- HDU 4370 0 or 1 (SPFA)
- HDU-4370 0 or 1(SPFA)
- HDU 4370 0 or 1——spfa
- HDU 4370 0 or 1(巧妙思路转化,0/1规划,最短路SPFA)
- hdu 0 or 1(最短路spfa)(本质,抽象)
- 0 or 1 图论最短路spfa
- hdu 4370 0 or 1
- HDU 4370 0 or 1
- HDU 4370 0 or 1
- HDU 4370 0 or 1
- HDU 4370 0 or 1
- HDU,4370, 0 or 1
- HDU-4370 0 or 1
- HDU 3342 Legal or Not【拓扑+SPFA】
- 0 or 1 HDU
- Hdu4370 0 or 1 最短路径spfa
- HDU 2544 最短路(dijkstra or Floyd or bellman or spfa )
- 工作效率和薪水加倍的7个秘诀
- org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is d
- VC++6.0共享内存技术总结
- Ubuntu下如何解压缩zip,tar,tar.gz,tar.bz2文件
- VC++6.0内存文件映射
- [spfa] hdu 4370 0 or 1
- js函数与内置对象 第一天
- 在Eclipse中配置tomcat
- Eclipse 无法安装ADT插件 解决方法
- ajax+json
- 起点,起动,起飞
- 组网不求人!搭建简易Linux局网服务器
- struts-2.3.4.1 + hibernate-3.6.5 + spring-3.1.2手把手教你整合
- uva 10905 - Children's Game