首页 > 其他分享 >洛谷 P1841 [JSOI2007] 重要的城市 做题记录

洛谷 P1841 [JSOI2007] 重要的城市 做题记录

时间:2024-11-22 15:57:24浏览次数:1  
标签:洛谷 int res 短路 read maxn JSOI2007 P1841 define

前置芝士:floyd,组合数学

思路

因为要所有点的距离不变,所以我们需要一个全源最短路算法,理所当然的用上了 floyd(下文循环顺序默认为 \(k,i,j\))。
我们在记录最短路长度的时候,同时记录最短路的数量 \(sum\)。
最后我们枚举所有三个点组成的三元组,如果有 \(i\to k\to j\) 的最短路,且有 \(i\to j\) 的最短路数量正好是 \((i \to k )\times( k \to j)\) 的数量,那么就证明,\(i\to j\) 一定会经过 \(k\),故 \(k\) 是关键点。
时间复杂度:\(O(n^3)\)。
难点/坑点:注意自已到自己再到其它城市是不可行的,所以要记得在跑完 floyd 后将 \(f_{i,i}=\inf\)。

点击查看代码
#include<bits/stdc++.h>

#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 205
int n,m;
int f[maxn][maxn],sum[maxn][maxn];
void work() {
	in2(n,m);
	mem(f,0x3f);
	For(i,1,m) {
		int u,v,d;
		in3(u,v,d);
		f[u][v]=f[v][u]=min(f[u][v],d);
		sum[u][v]=1;sum[v][u]=1;
	}
	For(k,1,n) For(i,1,n) For(j,1,n)
		if(f[i][k]+f[k][j]<f[i][j])
			f[i][j]=f[i][k]+f[k][j],
			sum[i][j]=sum[i][k]*sum[k][j];
		else if(f[i][j]==f[i][k]+f[k][j])
			sum[i][j]+=sum[i][k]*sum[k][j];
	int flg=0;
	For(i,1,n) f[i][i]=1e9;
	For(k,1,n) {
		int fin=0;
		For(i,1,n){
			For(j,1,n)
				if(!fin&&f[i][j]==f[i][k]+f[k][j]&&sum[i][j]==sum[i][k]*sum[k][j])
				{
					cout<<k<<' ';
					fin=1;
					flg=1; break;
				}
			if(fin) break;
		}
	}
	if(!flg) return cout<<"No important cities.",void();
}

signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	int _=1;
//	int _=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

标签:洛谷,int,res,短路,read,maxn,JSOI2007,P1841,define
From: https://www.cnblogs.com/CodingGoat/p/18563054

相关文章

  • 洛谷P1597
    语句解析-洛谷语句解析题目背景木有背景……题目描述一串长度不超过255的PASCAL语言代码,只有a,b,c 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是`[变量]:=[变量或一位整数];`。未赋值的变量值为0输出a,b,c的值。输入格式......
  • 树状数组 Color the ball hdu 1556 线段树 洛谷p3372
    目录前言树状数组  lowbit函数  直观表述    代码   运行结果树状数组构建代码树状数组的应用  单点修改和(单点)区间查询  结合差分数组区间修改,单点查询        差分数组Colortheballhdu1556  问题描述  问题分析......
  • 【题解】洛谷P3531: [POI2012] LIT-Letters
    P3531[POI2012]LIT-Letters写了个假做法有点伤心,本以为是两个都求逆序对然后答案相减,但是这样在部分数据上确实合法,但是实际上毫无章法没有逻辑。正解考虑贪心,我们一个数字肯定要找最前面,第二次出现就去最前面第二次出现的位置,因为如果第一个A放在了后面,那么就有可能产生更对......
  • 洛谷P6225异或橙子
    洛谷P6225异或橙子位运算思维树状数组这是题面思路先看一下这个式子要干什么例如\(l=2,u=4\)的情况,记橙子序列\(A\)中第\(i\)个橙子的整数是\(a_i\),那么他要求的就是:\[a_2\oplusa_3\oplusa_4\oplus(a_2\oplusa_3)\oplus(a_3\oplusa_4)\oplus(a_2\oplusa_......
  • 洛谷算法题P1307 [NOIP2011 普及组] 数字反转
    题目题目描述给定一个整数N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。输入格式一个整数N。输出格式一个整数,表示反转后的新数。样例#1样例输入#1123样例输......
  • 洛谷 P11210 强制在线动态二维数点
    题目传送门题目中的点满足\(y\lex\),那么不妨把每个点看成区间\([y,x]\)。那么题目相当于要求维护若干个区间,支持修改,以及查询询问区间中区间长度的最小值。从“区间长度的最小值”入手。显然包含别的区间的区间不能成为答案。排除了这样的区间,剩下区间按左端点升序排序,则右端......
  • 洛谷 P1613 跑路 做题记录
    前置芝士:最短路、floyd传递闭包、倍增思路看到题目里面的一次能走\(2^k\)千米,我们联想到倍增,因为只能用跑路器。我们枚举\(k\),然后做一次传递闭包,\((i,j)\)走\(2^k\)千米是相连的,当且仅当有一个点\(k\)是的\((i,k),(k,j)\)可以通过走\(2^{k-1}\)千米相连。此时,\((......
  • 【题解】洛谷:P8593 「KDOI-02」一个弹的投
    P8593「KDOI-02」一个弹的投物理题。首先你要搞懂什么时候会炮弹碰撞,结论:y坐标相同时,水平位置\(x_i\lex_j\)且落点满足\(d_i\ged_j\),两炮弹必然碰撞。但是为什么呢,像我这种完全没学高中物理的伪高中生就不会了,下落时每个物体的相对的高度差是不变的,因为根据伽利略运动独......
  • 【洛谷】P1914 小书童——凯撒密码
    题目背景某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你。题目描述蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成。密码是由原文字符串(由不超过50个小写字母组成)中每个字母向后移动 n 位形成的。z 的下一个字母是 ......
  • 洛谷题单指南-二叉堆与树状数组-P2161 [SHOI2009] 会场预约
    原题链接:https://www.luogu.com.cn/problem/P2161题意解读:本题前面形式化描述已经足够清晰。解题思路:要判断线段之间是否有冲突(包含或者交叉),可以借助set,参考:https://www.cnblogs.com/jcwy/p/18447333只不过这里要统计冲突的数量,也就是允许相等的元素重复存在,可以借助multiset......