B3647 【模板】Floyd
floyd,这个遍历每个中间点
#include<bits/stdc++.h>
#define ll long long
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++(i))
#define lowbit(x) (x)&-1*(x)
using namespace std;
int way[101][101];
const int inf=100000;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m,a,b,c;
cin>>n>>m;
f(i,1,n)
f(j,1,n){
if(i!=j)
way[i][j]=inf;
}
f(i,1,m){
cin>>a>>b>>c;
way[a][b]=c,way[b][a]=c;
}
f(i,1,n)
f(j,1,n)
f(k,1,n){
if(j==k) continue;
way[j][k]=way[k][j]=min(way[j][k],way[j][i]+way[i][k]);
}
f(i,1,n){
f(j,1,n)
cout<<way[i][j]<<' ';
cout<<'\n';
}
return 0;
}
P4779 【模板】单源最短路径(标准版)
本来想用vector解决空间的问题,最后还是用一维数组模拟。堆优化
#include <bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++(i))
#define Ma(x,y) make_pair((x),(y))
const int N=1000010,M=2000010;
using namespace std;
int read() {
int X=0,w=1;
char c=getchar();
while (c<'0'||c>'9') {
if (c=='-') w=-1;
c=getchar();
}
while (c>='0'&&c<='9')
X=X*10+c-'0',c=getchar();
return X*w;
}
int st[N],di[N],vis[N],v[M],to[M],nex[M],n,m,s;
void ad(int fr,int to1,int v1,int i) {
nex[i]=st[fr];
v[i]=v1;
to[i]=to1;
st[fr]=i;
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void d(int s){
memset(di,0x3f,sizeof(di));
di[s]=0;
while(!q.empty()) q.pop();
q.push(Ma(0,s));
while(!q.empty()){
int cv=q.top().first,cto=q.top().second;
q.pop();
vis[cto]=1;
for(int i=st[cto];i;i=nex[i]){
int va=cv+v[i],to1=to[i];
if(di[to1]>va){
di[to1]=va;
q.push(Ma(va,to1));
}
}
}
}
int main(){
n=read(),m=read(),s=read();
f(i,1,m){
int a,b,c;
a=read(),b=read(),c=read();
ad(a,b,c,i);
}
d(s);
f(i,1,n) {
printf("%d ",di[i]);
}
}
P2661 [NOIP2015 提高组] 信息传递
并查集,路径压缩
#include <bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++(i))
#define Ma(x,y) make_pair((x),(y))
const int N=1000010,M=200002;
int ans=0x7777777fffffff;
using namespace std;
int read() {
int X=0,w=1;
char c=getchar();
while (c<'0'||c>'9') {
if (c=='-') w=-1;
c=getchar();
}
while (c>='0'&&c<='9')
X=X*10+c-'0',c=getchar();
return X*w;
}
int n;
int fa[M],siz[M];
inline int find(const int x)
{
if(fa[x]!=x)
{
int last=fa[x];
fa[x]=find(fa[x]);
siz[x]+=siz[last];
}
return fa[x];
}
inline void add(int x,int y)
{
int fa1=find(x),fa2=find(y);
if(fa1!=fa2){
fa[fa1]=fa2;
siz[x]=siz[y]+1;
}
else
ans=min(ans,siz[x]+siz[y]+1);
return;
}
int main(){
n=read();
f(i,1,n){
fa[i]=i;
}
f(i,1,n){
int a;
a=read();
add(i,a);
}
cout<<ans;
return 0;
}
P1144 最短路计数
dijkstra
#include<bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++i)
#define bitlow(a) ((a)&-1*(a))
using namespace std;
struct node{
int dis,to;
};
const int mod=100003,M=2000002,N=1000002;
int n,m,cnt=0;
int sta[N],nex[M*2],to[M*2],vis[N];
unsigned long long dis_num[N],dis[N];
inline int read()
{
int X=0,w; char a=getchar();
while(a<'0'||a>'9'){
if(a=='-')
w=-1;
a=getchar();
}
while(a>='0'&&a<='9'){
X=X*10+a-'0';
a=getchar();
}
return X;
}
inline void add(const int x,const int y)
{
++cnt;
nex[cnt]=sta[x];
to[cnt]=y;
sta[x]=cnt;
return;
}
void print()
{
f(i,1,n)
printf("%d\n",dis_num[i]%mod);
}
void dijkstra(const int start)// dis==1
{
memset(dis,0x7f,sizeof(dis));
dis[start]=0,dis_num[start]=1;
queue<node> q;
q.push((node){1,start});
while(!q.empty())
{
node cur=q.front();
q.pop();
if(vis[cur.to]) continue;
vis[cur.to]=1;
int v=cur.dis+1;
for(int i=sta[cur.to];i;i=nex[i])
{
int to1=to[i];
if(dis[to1]>v){
dis[to1]=v;
dis_num[to1]=0;
}
if(v==dis[to[i]]){
dis_num[to1]+=dis_num[cur.to]%mod;
q.push((node){cur.dis+1,to[i]});
}
}
}
}
int main()
{
n=read(),m=read();
f(i,1,m){
int a,b;
a=read(),b=read();
if(a==b) continue;
add(a,b);
add(b,a);
}
dijkstra(1);
print();
return 0;
}
P8794 蓝桥杯 2022 国 A] 环境治理
二分+弗洛伊德
#include<bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++i)
#define bitlow(a) ((a)&-1*(a))
#define Ma(x,y) make_pair((x),(y))
using namespace std;
const int mod=100003,M=2000002,N=108;
int Q,v[N][N],low[N][N];
int n;
inline int read()
{
int X=0,w; char a=getchar();
while(a<'0'||a>'9'){
if(a=='-')
w=-1;
a=getchar();
}
while(a>='0'&&a<='9'){
X=X*10+a-'0';
a=getchar();
}
return X;
}
inline check(int x)
{
int dis[N][N];
f(i,1,n){
int t=x/n+(x%n>=i?1:0);
f(j,1,n)
dis[i][j]=max(low[i][j],v[i][j]-t);
}
int sum=0;
f(k,1,n)
f(i,1,n)
f(j,1,n)
dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
f(i,1,n)
f(j,1,n)
sum+=dis[i][j];
return sum;
}
int main()
{
n=read(),Q=read();
f(i,1,n)
f(j,1,n)
v[i][j]=read();
f(i,1,n)
f(j,1,n){
low[i][j]=read();
}
int ans=-1;
int l=0,r=100000*n;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid)<=Q){
r=mid-1;
ans=mid;
}
else
l=mid+1;
}
printf("%d\n",ans);
return 0;
}