魔法宝石

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 254    Accepted Submission(s): 85

Problem Description
小s想要创造n种魔法宝石。小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值)。请你帮小s算出合成某种宝石的所需的最小花费。
Input
第一行为数据组数T(1≤T≤3)。
对于每组数据,首先一行为n,m(1≤n,m≤10^5)。分别表示魔法宝石种类数和合成魔法的数量。
之后一行n个数表示a1到an。(1≤ai≤10^9)。ai表示合成第i种宝石所需的魔力值。
之后m行,每行三个数a,b,c(1≤a,b,c≤n),表示一个第a种宝石和第b种宝石,可以合成一个第c种宝石。
Output
每组数据输出一行n个数,其中第i个数表示合成第i种宝石的魔力值最小花费。
Sample Input
1 3 1 1 1 10 1 2 3
Sample Output
1 1 2

有n种宝石,让伟大的魔法师去合成,耗费最少的魔法值,题意表述的挺清晰的,不过,不保证没有圈的存在,比如a+b=c;a+c=b;b+c=a; 这样就有点ggl了,咋办。。。。

第一次看到这道题是17年山东省浪潮杯热身赛,当时第一次去参加省赛,激动,这个题没做出来,后来想了想热身赛。没事哒,不过后来又在杭电的一个比赛上看到了,确实该弄弄了,不能一直没进步。

思路,用spfa,记录下来每一个改变过的点,然后去搜索,搜索时找到这个点改变的起点(如果a+b=c),就找a,把所有从a开始的点都更新一遍,那些变动的点再次进入队列,从重复下去一定可以走到所有点的稳定状态----最小状态。

spfa

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;
const int maxn=1e5+5;
int t;
int n,m,len;
int mi[maxn];
int first[maxn];
bool ex[maxn];
queue <int> Q;
struct node{int v1,v2,nxt;
}nn[maxn*2];void spfa(){while(!Q.empty()){int st=Q.front();Q.pop();ex[st]=false;for(int i=first[st];i!=-1;i=nn[i].nxt){int v1=nn[i].v1,v2=nn[i].v2;if(mi[v2] > mi[v1]+mi[st]){mi[v2] = mi[v1]+mi[st];if(!ex[v2]){Q.push(v2);ex[v2]=true;}}}}
}void add_pi(int u,int v1,int v2){nn[len].v1=v1;nn[len].v2=v2;nn[len].nxt=first[u];first[u]=len++;
}
int main()
{scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(first,-1,sizeof(first));memset(ex,false,sizeof(ex));while(!Q.empty())Q.pop();for(int i=1;i<=n;i++){scanf("%d",mi+i);}int a,b,c;len=0;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);add_pi(a,b,c);add_pi(b,a,c);if( mi[c] > mi[a] + mi[b] ){mi[c] = mi[a] + mi[b];if(!ex[c]){Q.push(c);ex[c]=true; }}}spfa();printf("%d",mi[1]);for(int i=2;i<=n;i++){printf(" %d",mi[i]);}printf("\n");} return 0;
}

既然只要把所有点稳定状态找到就可以,那么 直接暴力就可以哒

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <algorithm>using namespace std;
const int MAXN=1e5+5;
int t;
int n,m;
int p[MAXN],mi[MAXN];
int a,b,c;
struct node{int v1,v2,nxt;
}nn[MAXN];int main()
{scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",p+i);mi[i]=p[i];}for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c); nn[i].v1=a;nn[i].v2=b;nn[i].nxt=c;}int flag=0;while(1){for(int i=1;i<=m;i++){int sum=mi[nn[i].v1]+mi[nn[i].v2];if(sum < mi[nn[i].nxt]){mi[nn[i].nxt]=sum; flag=1;}} if(!flag)break ;flag=0;}printf("%d",mi[1]);for(int i=2;i<=n;i++){printf(" %d",mi[i]);}printf("\n");}    return 0;
}

暴力50次也可以过,估计比赛的时候很多人都是暴力过的吧

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <algorithm>using namespace std;
const int MAXN=1e5+5;
int t;
int n,m;
int p[MAXN],mi[MAXN];
int a,b,c;
struct node{int v1,v2,nxt;
}nn[MAXN];int main()
{scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",p+i);mi[i]=p[i];}for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c); nn[i].v1=a;nn[i].v2=b;nn[i].nxt=c;}int o=50;while(o--){for(int i=1;i<=m;i++){int sum=mi[nn[i].v1]+mi[nn[i].v2];if(sum < mi[nn[i].nxt])mi[nn[i].nxt]=sum;} }printf("%d",mi[1]);for(int i=2;i<=n;i++){printf(" %d",mi[i]);}printf("\n");}    return 0;
}

HAUT 1262 魔法宝石 暴力思想,多种解决方案相关推荐

  1. 【haut 1262: 魔法宝石】+ 暴力

    1262: 魔法宝石 时间限制: 2 秒 内存限制: 64 MB 提交: 389 解决: 100 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用 ...

  2. HAUT 1262 魔法宝石 (最短路变形 or 暴力)

    1262: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 537  解决: 164 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是 ...

  3. haut 1262: 魔法宝石(dij+堆优化)@

    1262: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 346  解决: 85 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使 ...

  4. HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)

    魔法宝石 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值).请你帮小s算出合成某种宝石的所需的最小花费. 输入 第一行为 ...

  5. 1262: 魔法宝石

    http://218.28.220.249:50015/JudgeOnline/problem.php?id=1262 1262: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 37 ...

  6. HAUTOJ 1262: 魔法宝石 24行代码

    1262: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 332  解决: 77 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使 ...

  7. HAUT校赛 魔法宝石 暴力

    问题 C: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 505  解决: 149 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是 ...

  8. hautoj 1262 魔法宝石【最短路】

    点击打开链接 时间限制: 2 秒  内存限制: 64 MB 提交: 510  解决: 150 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个 ...

  9. 1262: 魔法宝石 (“玲珑杯”河南工业大学ACM程序设计大赛)

    问题 C: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 242  解决: 46 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使 ...

最新文章

  1. Android消息机制Handler用法
  2. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
  3. 走在技术前沿的 iOS 架构实现
  4. 英语笔记3(git)
  5. 当AR落地B端行业应用,它的无限可能在哪?
  6. 一个适用各类场合的Makefile模板
  7. Atitit gui界面ui技术发展史与未来趋势
  8. 计算机知识中h表达什么意思,计算机地基础知识hzh.ppt
  9. 机器学习入门实战——线性支持向量机实战digits数据集
  10. java sdk qq登录授权_社会化登录分享-QQ SDK接入
  11. 如何用photoshop做24色环_色相环:用PS做色相环教程
  12. 2012-7-05可樂词汇积累#9312;
  13. 两名一流高校硕士同年毕业论文高度雷同惹争议,怎么过的查重?
  14. 沈航计算机学院杨华,考研榜样经验分享之电子信息工程学院篇-沈航学生处
  15. linux 生成内核patch,谢宝友: 手把手教你给Linux内核发patch
  16. win10家庭版开启Hyper-V
  17. C++实现double factorial双阶乘的算法(附完整源码)
  18. 电脑公司特别版XP系统 版本及MD5说明
  19. 破产清算!王思聪也没想到会有这一天。。。
  20. Uedit32里面在哪儿设置去掉它自己生成的.bak文件?

热门文章

  1. Spring Boot 实践折腾记(12):支持数据缓存Cache
  2. 华为云Linux部署深度学习项目
  3. 目标检测指标mAP详解
  4. 色阶、灰度色彩模式、灰度等级
  5. 【android编程】第五讲-Android高级组件
  6. 如何打开 Visual Studio Installer 安装页面
  7. 火车头采集文章到本地-火车头采集导出各种格式导本地设置
  8. Java编程思想第四版读书笔记——第九章 接口
  9. 如何让vs2019的主题变好看(NightOwl主题为例)???像vscode和webstorm一样自定义主题!!!
  10. Windows 系统查找快捷键冲突