Holy Grail————计蒜客

2024-02-02 18:08
文章标签 计蒜客 holy grail

本文主要是介绍Holy Grail————计蒜客,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接
https://nanti.jisuanke.com/t/41305/
思路
      题意是给一个n个点m条有向边的图,题目保证可能会存在负权边,不存在重边和自环,也不存在负环,然后给出六条边的起点u和终点v,题目保证在添加前不会有能从u到达v的路径。
      每次添加都要保证:第一,按照题意,是要添加一条反向边将本来能从v到u的最短路变成权重为0(题目说花费,一个意思)。第二,添加之后不能有负环,第三,添加后的边会影响后面的添加。所以牵扯到负环那么本题自然采用SPFA算法(没用Bellman_Ford是因为第一复杂度不如SPFA,第二不习惯0.0),求出v到u的最短路后添加上负号即可。

      为什么可以直接添加负号这里写一下我的证明想法,可能不太规范,如果搜到最短路是正的,那么直接在起终点添加一个负权边不会有负环,因为是它是所有路径的最小值且为正,那么就算取负号也不会影响其它路径成为负环;如果是负的同理,会找到所有路径的最小值且为负,那么这个负值取相反数之后就会比其它所有路径的绝对值都要大,那么它一定能让所有形成的环都变成正值;如果搜不到最短路,就代表存在负环,但是题目保证了初始图不存在负环,故这个情况不存在。
c++代码

#include<bits/stdc++.h>
using namespace std;const int INF=1e9+2;
const int N=310;int n,m;
int g[N][N];
int dis[N],vis[N];void SPFA(int u){memset(dis, INF, sizeof(dis));memset(vis,0,sizeof(vis));dis[u] = 0;vis[u] = 1;queue<int> q;q.push(u);while(q.size()){auto t=q.front();q.pop();vis[t]=0;for(int i=0;i<n;i++){if(dis[i]>dis[t]+g[t][i]){dis[i]=dis[t]+g[t][i];if(!vis[i]){vis[i]=1;q.push(i);}}}}
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(g,INF,sizeof(g));for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);g[a][b]=c;}for(int i=0;i<6;i++){int u,v;scanf("%d%d",&u,&v);SPFA(v);g[u][v]=-dis[u];printf("%d\n",g[u][v]);}}return 0;
}

这篇关于Holy Grail————计蒜客的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671543

相关文章

计蒜客 Skiing 最长路

In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort has MM different ski paths and NN different flags situated at those turning points. The ii-th path from the

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

hdu 4719 Oh My Holy FFF(线段数+dp)

题目链接:hdu 4719 Oh My Holy FFF 题目大意:队伍里有n个人,给出每个人的身高,他们按照顺序排列,现在要将这n个人分成若干组,每一组的人数不得大于l,并且第i组的最后一个人的身高一定要大于第i−1组的最后一个人的身高。要求最后的权值最大,权值计算方法在题目中,k为组号。 解题思路:dp[i]表示以第i个人作为结尾的最大权值,那么dp[i]肯定是从前面的l-1个中转移

计蒜客 李白喝酒

感觉这题很有趣,虽然是用来举例二进制的 一天,他提着酒壶,从家里出来,酒壶中有酒两斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光。清计算李白遇到店的和花的次序, 有多少可能的方案。 int ans=0;//方案数 for(int i=0;i<(1<<14);i++){//暴力枚

计蒜客 T1797 最小数和最大数

题目链接:https://nanti.jisuanke.com/t/T1797 算法特工队QQ群:979618872 (伸手党绕边,欢迎有良好基础的人加入) //// Created by Leo Lee on 2019/4/5.//#include <iostream>using namespace std;int main(){int counts;cin>>counts;int t

计蒜客 T1725 国王的魔镜

题目链接:https://nanti.jisuanke.com/t/T1725 算法特工队QQ群:979618872 (伸手党绕边,欢迎有良好基础的人加入) //// Created by Leo Lee on 2019/4/5.//#include <iostream>#include <string>using namespace std;unsigned long minLong

计蒜客 T1677 农场周围的道路

题目链接:https://nanti.jisuanke.com/t/T1677 算法特工队QQ群:979618872 (伸手党绕边,欢迎有良好基础的人加入) //// Created by Leo Lee on 2019/4/5.//#include <iostream>using namespace std;void getGroups(int bulls,int k);int gr

计蒜客 T1560 二分查找(一)

题目链接:https://nanti.jisuanke.com/t/T1560 算法特工队QQ群:979618872 (伸手党绕边,欢迎有良好基础的人加入) //// Created by Leo Lee on 2019/4/5.//#include <iostream>#include <algorithm>using namespace std;long long arr[1000

计蒜客 T1319 质数判定一

题目链接:https://nanti.jisuanke.com/t/T1319 算法特工队QQ群:979618872 (伸手党绕边,欢迎有良好基础的人加入) //// Created by Leo Lee on 2019/4/5.//#include <iostream>#include <math.h>using namespace std;bool isprime(long lon

计蒜客 T1109 字符替换

题目链接:https://nanti.jisuanke.com/t/T1109 https://nanti.jisuanke.com/t/T1109 //// Created by Leo Lee on 2019/4/5.//#include <iostream>#include <string>using namespace std;int main(){string str;cha