思路:虽然是最短路专题里的,但也很难想到是最短路,如果能通过这些关系想到图论可能会有些思路。我们把X数组看做邻接矩阵,那么三个条件就转化为了:1、1的出度为1;2、n的入度为1;3、2~n-1的出度等于入度。C*X则是路径花费,最后求满足这些条件的路径的最少花费。满足这些条件的情况有两种:一是1到n的一条最短路径,二是1成自环,n成自环。最后找出两者最小值。

这里要注意下spfa的写法,因为需要成自环,所以dist[st]初始化为INF,保证成自环而非0;先让其他点入队。

代码:

#include<cstdio>
#include<set>
#include<cmath>
#include<stack>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = +;
const int INF = 0x3f3f3f3f;
int cost[maxn][maxn];
bool vis[maxn];
int cnt[maxn];
int dist[maxn];
bool spfa(int st,int n){
memset(vis,false,sizeof(vis));
vis[st] = true;
queue<int> q;
while(!q.empty()) q.pop();
for(int i = ;i <= n;i++){
if(i != st) q.push(i);
dist[i] = cost[st][i];
}
dist[st] = INF;
memset(cnt,,sizeof(cnt));
cnt[st] = ;
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for(int v = ;v <= n;v++){
if(dist[v] > dist[u] + cost[u][v]){
dist[v] = dist[u] + cost[u][v];
if(!vis[v]){
vis[v] = true;
q.push(v);
if(++cnt[v] > n) return false;
}
}
}
}
return true;
}
int main(){
int n;
while(~scanf("%d",&n)){
for(int i = ;i <= n;i++){
for(int j = ;j <= n;j++){
int w;
scanf("%d",&w);
cost[i][j] = w;
}
}
spfa(,n);
int ans1 = dist[n];
int ans2 = dist[];
spfa(n,n);
ans2 += dist[n];
printf("%d\n",min(ans1,ans2));
}
return ;
}

HDU 4370 0 or 1(转化为最短路)题解的更多相关文章

  1. HDU 4370 0 or 1 (最短路+最小环)

    0 or 1 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/R Description Given a n*n matrix ...

  2. HDU - 4370 0 or 1

    0 or 1 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. HDU - 4370 0 or 1 最短路

    HDU - 4370 参考:https://www.cnblogs.com/hollowstory/p/5670128.html 题意: 给定一个矩阵C, 构造一个A矩阵,满足条件: 1.X12+X1 ...

  4. HDU 4370 0 or 1(spfa+思维建图+计算最小环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 题目大意:有一个n*n的矩阵Cij(1<=i,j<=n),要找到矩阵Xij(i< ...

  5. (中等) HDU 4370 0 or 1,建模+Dijkstra。

    Description Given a n*n matrix C ij (1<=i,j<=n),We want to find a n*n matrix X ij (1<=i,j&l ...

  6. HDU 4370 0 or 1 (最短路)

    [题目链接](http://acm.hdu.edu.cn/showproblem.ph Problem Description Given a n/n matrix Cij (1<=i,j< ...

  7. HDU 4370 - 0 or 1 (SPFA+思维)

    题意:给一个N*N的矩阵C,和一个N*N的只由0和1组成的矩阵X. X满足以下条件: 1.X 12+X 13+...X 1n=1  2.X 1n+X 2n+...X n-1n=1  3.任意 i (1 ...

  8. 思维题(转换) HDU 4370 0 or 1

    题目传送门 题意:题目巨晦涩的传递出1点和n点的初度等于入度等于1, 其余点出度和入度相等 分析:求最小和可以转换成求最短路,这样符合条件,但是还有一种情况.1点形成一个环,n点也形成一个环,这样也是 ...

  9. HDU 4370 0 or 1 (01规划)【Dijkstra】||【spfa】

    <题目链接> 题目大意: 一个n*n的01矩阵,满足以下条件 1.X12+X13+...X1n=12.X1n+X2n+...Xn-1n=13.for each i (1<i<n ...

随机推荐

  1. Neutron SDN 手动实现手册

    安装架构介绍 本文旨在通过自己搭建类似neutron (openvswitch + gre) 实现SDN 的环境,学习了解其工作原理,模拟核心原理,比如:同一租户自定义网络 instance 互通,手 ...

  2. 【Java nio】Channel

    package com.slp.nio; import org.junit.Test; import java.io.*; import java.nio.ByteBuffer; import jav ...

  3. Android 获取系统默认输入法

    import android.provider.Settings; import android.text.TextUtils; 获取默认输入法包名: private String getDefaul ...

  4. C#IIS网站应用程序池启动回收停止 .

    //添加应用程序池空间引用using System.DirectoryServices;using System.Text; using System.Text.RegularExpressions; ...

  5. Linux系统修改编码(转)

    Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK.方法如下: 方法1: vi ...

  6. create sequence

    create sequence seq_test start with 3 increment by 1 minvalue 1  --范围-(1027 -1) maxvalue 99999999999 ...

  7. Spring MVC 框架学习

    一.spirng的简介 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情. ...

  8. JS实现数字千位符格式化方法

    /** * [number_format 参数说明:] * @param {[type]} number [number:要格式化的数字] * @param {[type]} decimals [de ...

  9. Python开发【Django】:Form组件

    Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...

  10. Linux知识总汇

    Linux相关教程 Linux的安装以及基础配置 Linux上安装Python3 Linux上安装pip以及setuptools Linux上安装MySQL Linux上安装Django Linux上 ...