1130 - 喵哈哈村的魔法大师╳灬兲笙疯癫°月

Time Limit:1s Memory Limit:256MByte

Submissions:196Solved:23

DESCRIPTION

╳灬兲笙疯癫°月是月大叔的ID,他是一个掌握着429种魔法的魔法大师,最擅长的技能就是搞事,今天他又要开始搞事了。

现在有一个由n个点,m条边组成的有向图,每个点上面都有一个魔法家族。

现在月大叔为了通知别人参加他的魔法大会,于是他就要拜访所有的家族。

由于是有向图,所以可能存在过去,就无法回来的情况,但是没有关系。

月大叔可以创造传送卷轴,传送卷轴可以传送到任意一个点。

第i张传送卷轴的造价是aiai元,可以使用cici次,当然每个卷轴只能造一次。

现在问你月大叔最少需要多少钱,就可以拜访所有的人了。

注意一开始月大叔就得使用一次传送魔法噢。

INPUT
输入第一行包含一个正整数t(1≤t≤100)t(1≤t≤100) ,表示有t组数据对于每组数据:第一行三个整数n,m,k。表示有n(1≤n≤500)n(1≤n≤500)个点,m(1≤m≤n∗(n−1)/2)m(1≤m≤n∗(n−1)/2)条边,k(1≤k≤500)k(1≤k≤500)种魔法卷轴接下来m行,每行两个整数u,v,表示u到v之间有一条有向边,可能存在自环、重边的情况。接下来k行,每行两个整数ai(1≤ai≤500)ai(1≤ai≤500),ci(1≤ci≤500)ci(1≤ci≤500),分别表示卷轴的造价和使用次数。
OUTPUT
对于每组测试数据的询问,输出有多少对即可。对于每组测试数据的询问,输出最少花多少钱即可如果无解的话,请输出"-1"
SAMPLE INPUT
1
5 5 3
5 2
2 5
1 4
1 1
2 1
4 2
4 1
4 3

SAMPLE OUTPUT
4
SOLUTION

思路:

这个题好总和丫。

首先问题的模型就是一个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 - 喵哈哈村的魔法大师╳灬兲笙疯癫°月【强连通+可相交最小路径覆盖+背包】相关推荐

  1. ifrog 1130 喵哈哈村的魔法大师╳灬兲笙疯癫°月 缩点+最小路径覆盖+背包

    题目链接点这里 题意应该很清楚.. wa了无数发,,居然没察觉最小路径覆盖不能有环,,,会出错,,(捂脸 然后,,就是先缩点,,然后floyd传递闭包(害怕超时的同学,,可以bitset压缩然后flo ...

  2. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  3. 喵哈哈村的魔法源泉(3)-(树的直径)

    喵哈哈村的魔法源泉(3) 发布时间: 2017年5月9日 20:59   最后更新: 2017年5月9日 20:59   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村有一个魔法源 ...

  4. 喵哈哈村的魔法考试 (1)

    描述 传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石,拥有$A$的能量:第二种魔法石叫做地冈石,拥有$B$的能量:而第三种,则是最神奇的天玄石,拥有无可比拟的$C$的能量! 但是有一天,沈宝宝 ...

  5. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问 ...

  6. 喵哈哈村的魔法考试 Round #5 (Div.2) C

    喵哈哈村的狼人杀大战(4) 发布时间: 2017年3月6日 11:36   最后更新: 2017年3月6日 11:39   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村最近热衷于 ...

  7. 喵哈哈村的魔法考试 Round #10 (Div.2) B

    喵哈哈村与哗啦啦村的大战(二) 发布时间: 2017年3月27日 09:25   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村因为和哗啦啦村争夺稀有的水晶资源,展开了激烈的战斗. ...

  8. 喵哈哈村的魔法考试 Round #9 (Div.2) 题解

    A题 喵哈哈村的数据筛选游戏 题解:这道题签到题,拿个数组记录一下这个数是否出现过即可. #include<bits/stdc++.h> using namespace std; cons ...

  9. 喵哈哈村的魔法考试 Round #1 (Div.2) C 喵哈哈村的魔法石(II) 背包dp

    点击打开链接 描述 沈宝宝的天玄石做的又丑又难看,戴尔廖实在是看不下去了,于是就出手帮助了他. 戴尔廖从怀中掏出了很多块神奇的石头,这些石头都是矿石结晶.每颗矿石结晶拥有着的人之精华,以及的地之精华. ...

最新文章

  1. 细思极恐的2016智能交通!怎么回事?
  2. 大学生创新创业大赛案例_第五届“南博杯”大学生创新创业大赛决赛举行
  3. Groove 线上办公室
  4. Mouse Without Borders 一套鼠标键盘控制多台电脑
  5. 《机器学习》 —— 第一章:绪论 学习笔记
  6. 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
  7. 枚举算法:概率计算。在标注编号分别为1,2,...,n的n张牌中抽取3张,试求抽出3张牌编号之和为素数的概率。输入整数n(3<n<=3000),输出对应的概率(四舍五入到小数点后第3位)。
  8. 10月19日 蒟蒻的流水账
  9. 手机号码归属地数据库下载
  10. CMMB手机电视自毁长城?
  11. easyui数据表格批量删除(datagrid 的deleteRow方法)
  12. 前端开发中常用的几种设计模式
  13. 使用Jekyll + GitHub 搭建自己的博客
  14. 微信小程序 使用webview 缓存解决办法
  15. jsptitle换行_fullcalendar中title内容过长显示不全的问题
  16. 数学黑洞(二)任何数都逃不出的西西弗斯黑洞
  17. 图像评价指标——PSNR、SSIM、FID、KID
  18. contest1 CF70 BetaRound ooxxx ooxxx ooooo
  19. mysql 视图调用存储过程_MySQL视图、存储过程
  20. SSA动态字幕制作技术讲座(转)

热门文章

  1. 桃飘火焰焰,梨堕雪漠漠。(排序 贪心
  2. 单片机 c语言 可控硅,单片机控制可控硅.doc
  3. Request Headers 和Response Headers——请求头和响应头
  4. linux服务器定时关机重启,Ubuntu Server 10.10 每天定时开关机
  5. 橙瓜码字多端同步、十份云储存本地实时备份,最放心的码字软件
  6. android_54a3,碉堡了,连神画Y1投影仪都可以跑android大型游戏N.0.V.A3
  7. 制作u盘版的kail linux 系统,即插即用,用于破解邻居妹子家的wifi
  8. repo sync error.GitError: manifests rev-list : fatal: revision walk setup failed
  9. webpy使用说明(二)
  10. visio图片导入word和PPT的最清晰的方式