细菌 题解

题目描述

为了研究一种新型细菌(称它为S型细菌)的性质,Q博士将S型细菌放在了一个犹如迷宫一般的通道面前,迷宫中N个站点,每个站点之间以一种单向通道的形式连接,当然,也有可能某两个站点之间是互不联通的,但是保证S型细菌不会走了一段又绕回原处。

在迷宫中,1号点为入口,N号点为出口。S型细菌被放在了入口,它们在行进过程中只能选择一条通道前进,并要求通过某些通道到达出口。每经过一条通道的时间为1S,而细菌繁殖的速度为每秒多一倍。

为了更好地探究其性质,Q博士在沿途设置了一些利于其生长的培养液和限制其繁殖的青霉素,S型细菌的数量将因此而增加或者减少一定个数(当然,增减是在其繁殖之后计算)。

现在告诉你通道的连接情况和沿途Q博士设置的条件,Q博士想知道,至少应该放多少个细菌在入口,才能保证有细菌能够从出口出来?

输入格式

第一行为一个整数N(3 ≤ N ≤ 100),下面跟着的第i行第j个数为F[i,j](绝对值不超过10000的整数),表示第I个点到第J个点沿途中细菌增加或减少的个数。若F[I,J]=0则表示此路不通。

输出格式

一个正整数,表示至少需要多少个细菌放在入口。

思路:使用spfa,不断迭代更新。

//采取逆向思维,从n倒着搜;
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
    int next,to,dis;
}edge[50005];
int head[50005],n,cnt;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if (ch==‘-‘) f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
inline void add(int from,int to,int dis)
{
    edge[++cnt].next=head[from];
    edge[cnt].to=to;
    edge[cnt].dis=dis;
    head[from]=cnt;
}
int dis[105],vis[105];//dis[i]即从i到n的所需最少的细菌数
void work()
{
    queue<int> q;
    dis[n]=1;vis[n]=1;q.push(n);
    while(!q.empty())
    {
        int now=q.front();q.pop();vis[now]=0;
        for (int i=head[now];i;i=edge[i].next)
        {
            int to=edge[i].to;
            if (dis[to]>max((long long)1,(dis[now]+edge[i].dis+1)/2))
            {
                dis[to]=max((long long)1,(dis[now]+edge[i].dis+1)/2);
                if (!vis[to])
                {
                    q.push(to);
                    vis[to]=1;
                }
            }

        }
    }
}
signed main()
{
    n=read();
    for (int i=1;i<=n;i++) dis[i]=0x3f3f3f3f;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {
            int d=read();
            if (d!=0) add(j,i,-d);//反向存图
        }
    work();
    printf("%ld",dis[1]);
    return 0;
}

原文地址:https://www.cnblogs.com/Invictus-Ocean/p/12432088.html

时间: 2024-10-13 02:48:38

细菌 题解的相关文章

【题解】细菌

题目描述 近期,农场出现了D(1≤D≤15)种细菌.Farmer John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格.请你帮助John计算出最多可以选择多少头奶牛. 输入输出格式 输入格式 第一行,三个整数,N,D,K: 下面N行,第i行表示一头牛所携带的细菌情况.第一个整数di表示这头牛所携带的细菌种类数,后面di个整数表示这些细菌的各自种类标号. 输出格式 一行,只一个数M,最大可选奶牛数. 输入输出样

细菌(disease) (位运算)(状态压缩)

细菌(disease) 时间限制: 1 Sec  内存限制: 64 MB提交: 9  解决: 5[提交][状态][讨论版] 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格.请你帮助John计算出最多可以选择多少头奶牛. 输入 第1行:三个整数N,D,K. 下面N行:第i行表示一头牛所携带的细菌情况.第一个整数di表示这头牛所携带的细菌种类数,后面di个

【XY1371】细菌分裂

Description 某科学家在培养皿(可以认为培养皿无限大)的正中间0时刻放置了一个分裂能力极强的细菌,它每隔一段时间就会进行分裂.具体地说,当初始的细菌被激活后,它会向前移动T1格(含起点),之后会分裂成两个,方向分别为原方向向左和向右偏移45°,两个细菌分别沿自己的方向移动T2格后再次分裂,……,n个周期后,细菌停止了分裂.现在Smart想知道有多少个格子被细菌污染了(注意,只要细菌经过的格子就会被污染,一个格子多次经过算一次,一个格子可以同时存在多个细菌,具体见样例及样例说明). In

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了 

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

(leetcode题解)Pascal&#39;s Triangle

Pascal's Triangle  Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 题意实现一个杨辉三角. 这道题只要注意了边界条件应该很好实现出来,C++实现如下 vector<vector<int>> generate(int

2017ZZUACM省赛选拔试题部分题解----谨以纪念我这卡线滚粗的美好经历

写在前面: 其实心里有些小小的不爽又有点小小的舒畅,为啥捏?不爽当然是因为没被选拔上啦,舒畅捏则是因为没被选拔上反而让自己警醒,学长也提点很多很多."沉下去,然后一战成名"学长如是对我说,我很开心.其实这完全算不算是题解,只是我个人的一些小想法而已.而且到现在还有一题不会...让自己长点记性吧. 题目 A :聪明的田鼠 Time Limit: 1 Sec Memory Limit: 128 MB Description 田鼠MIUMIU来到了一片农田,农田可以看成是一个M*N个方格的矩

LeetCode-001题解

此题目摘自LeetCode001 Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2.