玲珑学院OJ 1130 - 喵哈哈村的魔法大师╳灬兲笙疯癫°月【强连通+可相交最小路径覆盖+背包】
Time Limit:1s Memory Limit:256MByte
Submissions:196Solved:23
╳灬兲笙疯癫°月是月大叔的ID,他是一个掌握着429种魔法的魔法大师,最擅长的技能就是搞事,今天他又要开始搞事了。
现在有一个由n个点,m条边组成的有向图,每个点上面都有一个魔法家族。
现在月大叔为了通知别人参加他的魔法大会,于是他就要拜访所有的家族。
由于是有向图,所以可能存在过去,就无法回来的情况,但是没有关系。
月大叔可以创造传送卷轴,传送卷轴可以传送到任意一个点。
第i张传送卷轴的造价是aiai元,可以使用cici次,当然每个卷轴只能造一次。
现在问你月大叔最少需要多少钱,就可以拜访所有的人了。
注意一开始月大叔就得使用一次传送魔法噢。
思路:
这个题好总和丫。
首先问题的模型就是一个DAG图上课相交最小路径覆盖问题。
但是首先这个题的图由输入可知,给出的图并不是DAG图,所以我们先Tarjan强连通搞出一个DAG图。
然后根据搞出来的DAG图,跑Floyd传递闭包,再建图跑二分匹配,又有最小路径覆盖=n-最大二分匹配数。
那么我们得到的最小路径覆盖数,就是需要传送的最小次数。
那么我们根据k个卷轴的信息,跑一发背包就行了。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
using namespace std;
struct node
{int cost,val;
}a[505];
vector<int >mp[505];
int mpp[505][505];
int match[551];
int dp[555*1000];
int stack[5000];
int color[5000];
int dfn[5000];
int low[5000];
int vis[5000];
int sig,cnt,tt;
int n,m,k;
void Floyd()
{for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(mpp[j][i]==1&&mpp[i][k]==1)mpp[j][k]=1;}}}
}
int find(int u)
{for(int i=1;i<=n;i++){if(i==u)continue;if(mpp[u][i]==1&&vis[i]==0){vis[i]=1;if(match[i]==-1||find(match[i])){match[i]=u;return 1;}}}return 0;
}
void Dp(int sum)
{int tot=0;for(int i=0;i<k;i++){int cost,val;scanf("%d%d",&a[i].cost,&a[i].val);tot+=a[i].cost;}int ans=0x3f3f3f3f;for(int i=0;i<=tot;i++)dp[i]=0;for(int i=0;i<k;i++){for(int j=tot;j>=a[i].cost;j--){dp[j]=max(dp[j],dp[j-a[i].cost]+a[i].val);if(dp[j]>=sum)ans=min(ans,j);}}if(ans==0x3f3f3f3f)printf("-1\n");elseprintf("%d\n",ans);return ;
}
void Slove()
{int sum=0;memset(match,-1,sizeof(match));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(find(i))sum++;}Dp(n-sum);
}
void Tarjan(int u)
{vis[u]=1;dfn[u]=low[u]=cnt++;stack[++tt]=u;for(int i=0;i<mp[u].size();i++){int v=mp[u][i];if(vis[v]==0)Tarjan(v);if(vis[v]==1)low[u]=min(low[u],low[v]);}if(dfn[u]==low[u]){sig++;do{color[stack[tt]]=sig;vis[stack[tt]]=-1;}while(stack[tt--]!=u);}
}
void DAG()
{cnt=1,sig=0,tt=-1;memset(stack,0,sizeof(stack));memset(color,0,sizeof(color));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){if(vis[i]==0)Tarjan(i);}for(int i=1;i<=n;i++){for(int j=0;j<mp[i].size();j++){int v=mp[i][j];if(color[i]!=color[v]){mpp[color[i]][color[v]]=1;}}}n=sig;
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);memset(mpp,0,sizeof(mpp));for(int i=1;i<=n;i++)mp[i].clear();for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);mp[x].push_back(y);}DAG();Floyd();Slove();}
}
玲珑学院OJ 1130 - 喵哈哈村的魔法大师╳灬兲笙疯癫°月【强连通+可相交最小路径覆盖+背包】相关推荐
- ifrog 1130 喵哈哈村的魔法大师╳灬兲笙疯癫°月 缩点+最小路径覆盖+背包
题目链接点这里 题意应该很清楚.. wa了无数发,,居然没察觉最小路径覆盖不能有环,,,会出错,,(捂脸 然后,,就是先缩点,,然后floyd传递闭包(害怕超时的同学,,可以bitset压缩然后flo ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)
A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05 最后更新: 2017年2月21日 20:06 时间限制: 1000ms 内存限制: 128M 描述 传说喵哈哈村有三种神 ...
- 喵哈哈村的魔法源泉(3)-(树的直径)
喵哈哈村的魔法源泉(3) 发布时间: 2017年5月9日 20:59 最后更新: 2017年5月9日 20:59 时间限制: 1000ms 内存限制: 128M 描述 喵哈哈村有一个魔法源 ...
- 喵哈哈村的魔法考试 (1)
描述 传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石,拥有$A$的能量:第二种魔法石叫做地冈石,拥有$B$的能量:而第三种,则是最神奇的天玄石,拥有无可比拟的$C$的能量! 但是有一天,沈宝宝 ...
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问 ...
- 喵哈哈村的魔法考试 Round #5 (Div.2) C
喵哈哈村的狼人杀大战(4) 发布时间: 2017年3月6日 11:36 最后更新: 2017年3月6日 11:39 时间限制: 1000ms 内存限制: 128M 描述 喵哈哈村最近热衷于 ...
- 喵哈哈村的魔法考试 Round #10 (Div.2) B
喵哈哈村与哗啦啦村的大战(二) 发布时间: 2017年3月27日 09:25 时间限制: 1000ms 内存限制: 128M 描述 喵哈哈村因为和哗啦啦村争夺稀有的水晶资源,展开了激烈的战斗. ...
- 喵哈哈村的魔法考试 Round #9 (Div.2) 题解
A题 喵哈哈村的数据筛选游戏 题解:这道题签到题,拿个数组记录一下这个数是否出现过即可. #include<bits/stdc++.h> using namespace std; cons ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) C 喵哈哈村的魔法石(II) 背包dp
点击打开链接 描述 沈宝宝的天玄石做的又丑又难看,戴尔廖实在是看不下去了,于是就出手帮助了他. 戴尔廖从怀中掏出了很多块神奇的石头,这些石头都是矿石结晶.每颗矿石结晶拥有着的人之精华,以及的地之精华. ...
最新文章
- 细思极恐的2016智能交通!怎么回事?
- 大学生创新创业大赛案例_第五届“南博杯”大学生创新创业大赛决赛举行
- Groove 线上办公室
- Mouse Without Borders 一套鼠标键盘控制多台电脑
- 《机器学习》 —— 第一章:绪论 学习笔记
- 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
- 枚举算法:概率计算。在标注编号分别为1,2,...,n的n张牌中抽取3张,试求抽出3张牌编号之和为素数的概率。输入整数n(3<n<=3000),输出对应的概率(四舍五入到小数点后第3位)。
- 10月19日 蒟蒻的流水账
- 手机号码归属地数据库下载
- CMMB手机电视自毁长城?
- easyui数据表格批量删除(datagrid 的deleteRow方法)
- 前端开发中常用的几种设计模式
- 使用Jekyll + GitHub 搭建自己的博客
- 微信小程序 使用webview 缓存解决办法
- jsptitle换行_fullcalendar中title内容过长显示不全的问题
- 数学黑洞(二)任何数都逃不出的西西弗斯黑洞
- 图像评价指标——PSNR、SSIM、FID、KID
- contest1 CF70 BetaRound ooxxx ooxxx ooooo
- mysql 视图调用存储过程_MySQL视图、存储过程
- SSA动态字幕制作技术讲座(转)
热门文章
- 桃飘火焰焰,梨堕雪漠漠。(排序 贪心
- 单片机 c语言 可控硅,单片机控制可控硅.doc
- Request Headers 和Response Headers——请求头和响应头
- linux服务器定时关机重启,Ubuntu Server 10.10 每天定时开关机
- 橙瓜码字多端同步、十份云储存本地实时备份,最放心的码字软件
- android_54a3,碉堡了,连神画Y1投影仪都可以跑android大型游戏N.0.V.A3
- 制作u盘版的kail linux 系统,即插即用,用于破解邻居妹子家的wifi
- repo sync error.GitError: manifests rev-list : fatal: revision walk setup failed
- webpy使用说明(二)
- visio图片导入word和PPT的最清晰的方式