HDU4370:0 or 1(最短路)
0 or 1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370
Description:
Given a n*n matrix Cij (1<=i,j<=n),We want to find a n*n matrix Xij (1<=i,j<=n),which is 0 or 1.
Besides,Xij meets the following conditions:
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).
For example, if n=4,we can get the following equality:
X12+X13+X14=1
X14+X24+X34=1
X12+X22+X32+X42=X21+X22+X23+X24
X13+X23+X33+X43=X31+X32+X33+X34
Now ,we want to know the minimum of ∑Cij*Xij(1<=i,j<=n) you can get.
Input:
The input consists of multiple test cases (less than 35 case).
For each test case ,the first line contains one integer n (1<n<=300).
The next n lines, for each lines, each of which contains n integers, illustrating the matrix C, The j-th integer on i-th line is Cij(0<=Cij<=100000).
Output:
For each case, output the minimum of ∑Cij*Xij you can get.
Sample Input:
4 1 2 4 10 2 0 1 1 2 2 0 5 6 3 1 2
Sample Output:
3
Hint:
For sample, X12=X24=1,all other Xij is 0.
题意:
给出一个s矩阵,每个位置都有对应的权值,然后要求你构造一个X矩阵,满足一下条件:
1.X12+X13+...+X1n = 1;
2.X1n+X2n+...+Xn-1n = 1;
3.当1<i<n时,∑Xki (1<=k<=n)=∑Xij (1<=j<=n)。
问在满足以上条件的情况下,∑Cij*Xij(1<=i,j<=n)的最小值为多少?
题解:
orz神题...十分巧妙。
主要的思路就是将我们构造的X矩阵当作邻接矩阵就行了,对应位置为1则代表对应的行和列之间有连一条边。
那么根据条件我们知道:1号点只有一个出度,n号点只有一个入度,且2~n-1号点入度出度相等。
想到这里了之后,还要想两种情况:第1种是从1号点出发直接到n号点,中间每个点的出入度相等;第2种是从1号点出发然后形成一个环最后回到1号点,对于n号点也同理。
对于第一种情况很好求解,直接跑次spfa就行了,注意下对应边的权值,就为S数组里面的权值。
对于第二种情况,从1和n出发跑两次spfa,然后在spfa里面加个判断就ok了。
两种的spfa可以合并一下,本题就解完了~
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = ;
int n,tot,mn;;
int vis[N],head[N],c[N][N],d[N];
struct Edge{
int v,w,next;
}e[N*N<<];
void adde(int u,int v,int w){
e[tot].v=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;
}
void spfa(int s){
memset(vis,,sizeof(vis));
queue<int> q;q.push(s);vis[s]=;
memset(d,INF,sizeof(d));d[s]=;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=;
for(int i=head[u];i!=-;i=e[i].next){
int v=e[i].v;
if(d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
if(v==s){
mn=min(mn,d[u]+e[i].w);
}
}
}
return ;
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&c[i][j]);
memset(head,-,sizeof(head));tot=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j) continue ;
adde(i,j,c[i][j]);
}
}
mn=INF;
spfa();
int tmp=mn,ans=INF;
mn=INF;
ans=d[n];
spfa(n);
ans=min(ans,mn+tmp);
cout<<ans<<endl;
}
return ;
}
HDU4370:0 or 1(最短路)的更多相关文章
- HDU-4370 '0 or 1' 最短路 要考虑连通性
题目链接:https://cn.vjudge.net/problem/HDU-4370 题意 给一个矩阵C(nn),要我们找到一个矩阵X(nn),满足以下条件: X_{12}+X_{13}+...X_ ...
- HDU4370 0 or 1 最短路
分析: 1001 (已更新) 显然,题目给的是一个0/1规划模型.解题的关键在于如何看出这个模型的本质.3个条件明显在刻画未知数之间的关系,从图论的角度思考问题,容易得到下面3个结论:1.X12+X ...
- 分层图 (可以选择K条路的权为0,求最短路)
分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...
- hdu4370 0 or 1【最短路+建图】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297627.html ---by 墨染之樱花 题目链接:http://acm.hdu.ed ...
- HDU 4370 0 or 1 (最短路)
[题目链接](http://acm.hdu.edu.cn/showproblem.ph Problem Description Given a n/n matrix Cij (1<=i,j< ...
- HDU - 4370 0 or 1 最短路
HDU - 4370 参考:https://www.cnblogs.com/hollowstory/p/5670128.html 题意: 给定一个矩阵C, 构造一个A矩阵,满足条件: 1.X12+X1 ...
- hdu4370 比较抽象的最短路
题意: 给你一个n*n的矩阵,然后让咱们构造另一个n*n的矩阵,构造的矩阵有如下要求, 1.X12+X13+...X1n=1. 2.X1n+X2n+...Xn-1n=1. 3.for ea ...
- URAL 1002 Phone Numbers(KMP+最短路orDP)
In the present world you frequently meet a lot of call numbers and they are going to be longer and l ...
- poj3159 最短路(差分约束)
题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个. 这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 ...
- short-path problem (Spfa) 分类: ACM TYPE 2014-09-02 00:30 103人阅读 评论(0) 收藏
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #i ...
随机推荐
- 链栈的c++实现
2013-08-30 20:58 1876人阅读 评论(0) 收藏 举报 链栈是借用单链表实现的栈.其不同于顺序栈之处在于: 1.链栈的空间是程序运行期间根据需要动态分配的,机器内存是它的上限.而顺序 ...
- Kuernetes-设计架构(二)
Kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs,scheduler.etc),一切都基于分布式的存储系统.Kubernetes架构图: ...
- 【数据结构】 List 简单实现
public class XList<T> : IEnumerable, IEnumerator { #region List 简单实现 /// <summary> /// 存 ...
- java存储位置经典例子
String a="a";String b="b";String c="ab";String d="ab";String ...
- Qt 建立带有子项目的工程
刚需,软件需要用到多个子项目 第一步 打开Qt新建子项目工程 如图 在此时鼠标右键,选着新建子项目如图 就是正常的新建项目的步骤,直接上图 完工,可以愉快的撸代码了
- result returns more than one elements此种错误,解决
场景:公司产品开发完成后,接入第三方厂商,在进行接口联调的时候出现此问题.此接口报文中的每一个数据都要进行校验,有些是与已经存入产品数据库中的数据进行对比,看是否存在. 问题:在测试中,有些测试没有问 ...
- python 基础篇 04(列表 元组 常规操作)
本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...
- AGV小车典型设计算法及应用
1. AGV小车的发展背景 在现代化工业的发展中,提倡高效,快速,可靠,提倡将人从简单的工作中解放出来.机器人逐渐替代了人出现在各个工作岗位上.机器人具有可编程.可协调作业和基于传感器控制等特点,自动 ...
- mongodb数据库操作之简单查询
1. 2. 3.修改器 默认一条一条修改 4. 5.查询 6.mysql简单操作
- 在线算法&离线算法
[在线算法] 定义:指用户每输入一个查询便马上处理一个查询.该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询. 常见在线算法:ST算法 [离线算法] 定义: