hud 4370 0 or 1 (Djikstra,图论)
来源:互联网 发布:钢结构造价软件 编辑:程序博客网 时间:2024/06/04 19:17
这道题完全没思路,看了题解也还是不怎么明白原理~
先贴上题解慢慢研究吧~~~
解题的关键在于如何看出这个模型的本质。
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)
被自己的智商感动了。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int edge[305][305],dict[305],n;bool vis[305];int minn(int x,int y) { if(x > y) return y; else return x;}int dijkstra(int start,int &cir) { // 这里定义的是&cir,即cir的地址,这样就可以直接修改cir的值。 memset(vis,false,sizeof(vis)); for(int i = 1;i <= n;i++) dict[i] = inf; int now = start,k,min; dict[start] = 0; vis[start] = true; for(int j = 1;j <= n;j++) { min = inf; for(int i = 1;i <= n;i++) { if(!vis[i]) { if(edge[now][i] != inf && dict[i] > dict[now] + edge[now][i]) dict[i] = dict[now] + edge[now][i]; if(min > dict[i]) min = dict[k = i]; } if(i == start && now != start) cir = minn(cir,(dict[now] + edge[now][i])); // } vis[k] = true; now = k; } return dict[n];}int main() { while(scanf("%d",&n) != EOF) { for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) scanf("%d",&edge[i][j]); edge[i][i] = inf; } int ans,cir_1,cir_n,cir; cir_1 = cir_n = cir = inf; ans = dijkstra(1,cir_1); dijkstra(n,cir_n); cir = cir_1 + cir_n; printf("%d\n",minn(ans,cir)); }}
得好好理解下这道题目,无奈网上没找到详细的解释~都是官方题解~~
0 0
- hud 4370 0 or 1 (Djikstra,图论)
- POJ 2502 Subway (Djikstra)
- Hud 2456 饭卡[0-1背包变形]
- poj1797--djikstra
- Djikstra算法
- HUD 1501 Zipper(记忆化 or DP)
- HUD(Canvas)
- HUD
- HUD 2955 Robberies [0-1背包的简单转化]
- Hud 3466 Proud Merchantsp[0-1背包变形]
- HUD 1248 寒冰王座 0-1背包入门题
- hud oj 3466 Proud Merchants(0 1背包+贪心)
- hud 2602 Bone Collector (0_1背包模板题)
- HDU-4370 0 or 1(SPFA)
- 2014西安全国邀请赛 1003 && HDU 4849 Wow! Such City! (单源最短路Djikstra算法)
- hud 1114 (完全背包)
- hud 5826 physics(积分)
- 【HUD 1969】Pie(二分)
- js中==与===的区别
- Java缓存新标准(javax.cache)
- Maven常用命令与Maven聚合
- C#——JSON转换为对象
- 虚拟机 网络模式简介 及桥接模式设置
- hud 4370 0 or 1 (Djikstra,图论)
- PAT甲级练习题A1002. A+B for Polynomials
- C中的malloc和free
- Live Archive 3177 - Beijing Guards 二分+贪心
- 充电技术简介
- CentOS yum 源的配置与使用
- packetdrill框架点滴剖析以及TCP重传的一个细节
- 面向对象五大基本原则
- GP学习(五)—ArcGIS Toolbox Reference dialog box