uva1376-Animal Run(最小割+对偶图+最短路)


title: uva1376-Animal Run(最小割+对偶图+最短路)
date: 2019-06-04 16:27:49
categories: ACM
tags: [ACM,算法]

我图论好菜啊
我的个人博客:https://www.kimiye.xyz

题目描述

动物园动物要逃跑了,在每个路口有3条路可以走(横、竖、斜),现在给出每条路上警察需要派w个人就能堵住这条路,问最少需要派出多少人可以防止动物走到终点?
起点:左上角
终点:右下角

解题思路

显然从图的左下部分画一条穿过若干边的线到右上部分,图就被分成了2部分,把穿过的边的权值之和加起来就是候选答案,那么这就是一道最小割问题,但由于边数过多不能跑一个最大流,然而这是一个对偶图,可以将最大流转化为最短路求解,使用dijkstra优先队列优化的方法就能快速求解了。。。

代码:

#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int maxn = 2e6+7;
const int inf = 0x3f3f3f3f;
struct qnode
{
	int v;
	int c;
	qnode(int _v=0,int _c=0):v(_v),c(_c){}
	bool operator <(const qnode &r)const
	{
		return c>r.c;
	}
};
struct Edge
{
	int v,cost;
	Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
int n,m,kase;
vector<Edge> E[maxn];
bool vis[maxn];
int dist[maxn];

void Dijkstra(int n,int start)//点的编号从1开始
{
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++) dist[i]=inf;
	priority_queue<qnode>que;
	while(!que.empty()) que.pop();
	dist[start]=0;
	que.push(qnode(start,0));
	qnode tmp;
	while(!que.empty())
	{
		tmp=que.top();
		que.pop();
		int u=tmp.v;
		if(vis[u]) continue;
		vis[u]=true;
		for(int i=0;i<E[u].size();i++)
		{
			int v=E[u][i].v;
			int cost=E[u][i].cost;
			if(!vis[v]&&dist[v]>dist[u]+cost)
			{
				dist[v]=dist[u]+cost;
				que.push(qnode(v,dist[v]));
			}
		}
	}
}

void addedge(int u,int v,int w)
{
	E[u].push_back(Edge(v,w));
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF && n+m)
    {
        int s=2*(n-1)*(m-1)+2;
        int t=2*(n-1)*(m-1)+1;
        int u,v,w;
        for(int i=1;i<=s;i++)
            E[i].clear();
        // 横线
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m-1;j++)
            {
                scanf("%d",&w);
                if(i==1)
                {
                    u=2*j;
                    addedge(t,u,w);
                    addedge(u,t,w);
                }
                else if(i==n)
                {
                    u=2*(n-2)*(m-1)+2*(j-1)+1;
                    addedge(s,u,w);
                    addedge(u,s,w);
                }
                else
                {
                    // 跟下边的格子
                    u=2*(i-2)*(m-1)+2*(j-1)+1;
                    v=u+2*(m-1)+1;
                    addedge(u,v,w);
                    addedge(v,u,w);
                }
            }
        // 竖线
        for(int i=1;i<=n-1;i++)
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&w);
                if(j==1)
                {
                    u=2*(i-1)*(m-1)+1;
                    addedge(s,u,w);
                    addedge(u,s,w);
                }
                else if(j==m)
                {
                    u=2*i*(m-1);
                    addedge(t,u,w);
                    addedge(u,t,w);
                }
                else
                {
                    // 跟右边的格子
                    u=2*(i-1)*(m-1)+2*(j-1);
                    v=u+1;
                    addedge(u,v,w);
                    addedge(v,u,w);
                }
            }
        // 斜线
        for(int i=1;i<=n-1;i++)
            for(int j=1;j<=m-1;j++)
            {
                // 跟上面的格子
                scanf("%d",&w);
                u=2*(i-1)*(m-1)+2*j-1;
                v=u+1;
                addedge(u,v,w);
                addedge(v,u,w);
            }
        Dijkstra(s,s);
        printf("Case %d: Minimum = %d\n",++kase,dist[t]);
    }
    return 0;
}

全部评论

相关推荐

“无名小卒,还是名扬天下?”我知道很多人都不觉得我能走到今天这一步,当然,也包括我自己。在我的人生里,有两部作品刻下了最深的烙印:《斗破苍穹》与《龙族》。它们总被人拿来对照:一边是萧炎的桀骜轻狂,一边是路明非的怯懦衰颓。有人说,天蚕土豆没见过魂天帝,但江南见过真凯撒。我时常觉得,自己就是那个衰小孩路明非。可路明非可以开挂,我不可以;我也无数次幻想过,能拥有萧炎那般年少轻狂的人生,可我没有他与生俱来的逆天天赋。我只是个平庸的普通人,一个看过《斗破苍穹》却开不了挂的路明非,只能一步一步往上爬。从我下定决心找实习的那一刻起,我就给自己定下了目标:“我一定要为字节跳动卖命.jpg”。萧炎有他的三年之约,我有我的两年半之约(其实是一年半)。2024.11.20,科大讯飞的第一封实习offer落进邮箱,我迈出了这场奔赴的第一步。2025.8.18,放弃百度转正的安稳机会,转身走进前路未卜的不确定里。我很感谢我在百度的mentor,是她从茫茫人海选中了我,给了我大厂实习的机会。即便有段时间我状态差、产出不理想,她依旧愿意认可我、希望我留下转正。2025.11.14,我选择走进字节跳动,以实习生的身份重新出发。2026.3.25&nbsp;-&nbsp;3.31,一周速通上海飞书,幸遇赏识我的伯乐,斩获Special&nbsp;Offer。被告知面试通过的那一刻,我的内心无比平静,就像这个offer本就该属于我。不是侥幸,是应得的。这一路,有人看轻过我的出身,不相信我能走到这里;也有人在我看不见前路的时候,替我举过灯。没有他们的鼓励与支撑,就没有今天站在这里的我。我看到了自强不息的激荡,那是一个双非的伟大乐章!我是雨夜迈巴赫,我要开启属于我的新篇章了。
在看牛客的本杰明很勇...:真心祝贺l总 我永远的偶像 我滴神
春招至今,你收到几个面试...
点赞 评论 收藏
分享
刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务