Floyd算法做题笔记

题目1

这道题可以用板子,要注意如果有重边,取权重最小的那条边。

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int jz[60][60],m;
int main(){
	cin>>m;
	memset(jz,0x3f,sizeof(jz));
	for(int i=1;i<=52;i++) jz[i][i]=0;
	for(int i=1;i<=m;i++){
		char a,b;
		int u,v,w;
		cin>>a>>b>>w;
		if(a>='a') u=int(a)-70;
		else u=int(a)-64;
		if(b>='a') v=int(b)-70;
		else v=int(b)-64;
		jz[u][v]=min(jz[u][v],w);
		jz[v][u]=min(jz[v][u],w);
	}
	for(int k=1;k<=52;k++){
		for(int i=1;i<=52;i++){
			for(int j=1;j<=52;j++)
				jz[i][j]=min(jz[i][j],jz[i][k]+jz[k][j]);
		}
	}
	int maxi=0;
	jz[0][26]=1e9;
	for(int i=1;i<=25;i++){
		if(jz[maxi][26]>jz[i][26]) maxi=i; 
	}
	cout<<char(maxi+64)<<" "<<jz[maxi][26];
	return 0;
} 

题目2

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,d[110][110],g[110][110],ans=INF;
int main(){
	scanf("%d%d",&n,&m);
	memset(d,INF,sizeof(d));
	memset(g,INF,sizeof(g));
	for(int i=1;i<=n;i++) g[i][i]=0,d[i][i]=0;
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		d[u][v]=min(d[u][v],w);
		d[v][u]=min(d[v][u],w);
		g[u][v]=min(g[u][v],w);
		g[v][u]=min(g[v][u],w);
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(d[i][j]!=INF&&d[i][k]!=INF&&d[k][j]!=INF&&i!=k&&k!=j&&i!=j)
					ans=min(ans,d[i][j]+g[i][k]+g[k][j]);	
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
			}
		}
	}
	if(ans==INF) printf("No solution.");
	else printf("%d",ans);
	return 0;
}

题目3

FLoyd求最短路径并打印。我们这里开一个数组path,path[i][j]存储点i和j之间最短路径上离i最近的一个中转点。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int nxt[105][105],n,g[105][105];
void init(){
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            if(i==j) g[i][j]=g[j][i]=0;
            else g[i][j]=g[j][i]=1e9;
        }
    }
}
void printpath(){
    int st=1,ed=n;
    while(st!=ed){
        cout<<st<<" ";
        st=nxt[st][ed];
    }
    printf("%d",ed);
}
void floyd(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            nxt[i][j]=j;
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(g[i][j]>g[i][k]+g[k][j]){
                    g[i][j]=g[i][k]+g[k][j];
                    nxt[i][j]=nxt[i][k];
                }
            }
        }
    }
	cout<<"minlong=";
    printf("%d\n",g[1][n]);
    printpath();
}
int main(){
	cin>>n;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=n;j++){
	        cin>>g[i][j];
	        if(g[i][j]==0)
	            g[i][j]=99999;
		}
	}
    floyd();
    return 0;
}

题目4

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int g1[maxn][maxn],g2[maxn][maxn];
int n,m,ans;
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		g1[u][v]=1;
		g2[v][u]=1;
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)
				g1[i][j]|=(g1[i][k]&g1[k][j]);
		}
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)
				g2[i][j]|=(g2[i][k]&g2[k][j]);
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		int tmp1=0,tmp2=0;
		for(int j=1;j<=n;j++){
			tmp1+=g1[i][j];
			tmp2+=g2[i][j];		
		}
		if(abs(tmp1)>=(n+1)/2||abs(tmp2)>=(n+1)/2)
			++ans;
	}
	cout<<ans;
	return 0;
}
相关推荐
三品吉他手会点灯5 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
kobesdu5 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
sakiko_5 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
Old Uncle Tom5 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆6 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移6 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业6 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业8 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
JasmineX-19 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表
.5489 小时前
## Sorting(排序算法)
python·算法·排序算法