博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4370 0 or 1
阅读量:6237 次
发布时间:2019-06-22

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

题意:找出一个0,1,矩阵

分析:

转换思维的题啊,由一道让人不知如何下手的题,转换为了最短路基本思路就是把矩阵看做一个图,图中有n个点,1号点出度为1,
n号点入度为1,其它点出度和入度相等,路径长度都是非负数,等价于一条从1号节点到n号节点的路径,故Xij=1表示需要经
过边(i,j),代价为Cij。Xij=0表示不经过边(i,j)。注意到Cij非负且题目要求总代价最小,因此最优答案的路径一定可以对应一条简单路径。

最终,我们直接读入边权的邻接矩阵,跑一次1到n的最短路即可,记最短路为path。

漏了如下的情况B:

从1出发,走一个环(至少经过1个点,即不能是自环),回到1;从n出发,走一个环(同理),回到n。
也就是1和n点的出度和入度都为1,其它点的出度和入度为0.

由于边权非负,于是两个环对应着两个简单环。

因此我们可以从1出发,找一个最小花费环,记代价为c1,

再从n出发,找一个最小花费环,记代价为c2。
(只需在最短路算法更新权值时多加一条记录即可:if(i==S) cir=min(cir,dis[u]+g[u][i]))

故最终答案为min(path,c1+c2)

#include
#include
#define clr(x)memset(x,0,sizeof(x))#define INF 0x1f1f1f1f#define maxn 333#define min(a,b)(a)<(b)?(a):(b)int g[maxn][maxn];int d[maxn];int q[1000];int v[maxn];int n;void spfa(int st,int en){ int i,u,front,rear; front=rear=0; clr(v); d[st]=INF; for(i=1;i<=n;i++) { if(i!=st) { v[i]=1; d[i]=g[st][i]; q[rear++]=i; } } while(front!=rear) { u=q[front++]; v[u]=0; for(i=1;i<=n;i++) { if(d[u]+g[u][i]

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/09/05/2671213.html

你可能感兴趣的文章
通过PHP获取文件创建与修改时间
查看>>
数据行转列实例
查看>>
vs2010 CWnd::CreateEx Warning: Window creation failed: GetLastErro
查看>>
php monolog 的写日志到unix domain socket 测试终于成功
查看>>
kernel笔记——定时器与时间管理
查看>>
PyDev:warning: Debugger speedups using cython not foun
查看>>
APScheduler(Python化的Cron)使用总结 定时任务
查看>>
原始套接字简单应用
查看>>
单引号、双引号和三双引号的区别
查看>>
Eclipse快捷键大全(转载)
查看>>
Ambari服务依赖关系图生成脚本
查看>>
命令模式
查看>>
通过简单的mdev -s自动装配/dev目录下的设备文件
查看>>
[转]模态对话框与非模态对话的几种销毁方法与区别
查看>>
管理对象空间——段
查看>>
Storm - Guaranteeing message processing
查看>>
I.MX6 sdio 设备注册及识别
查看>>
获取股票数据的2个简单方法
查看>>
[MSSQL]ROW_NUMBER函数
查看>>
IE6,IE7 DIV高度技巧(div高度兼容问题)
查看>>