Floyd算法的特点

唯一一个多源的图论最短路算法,但是复杂度O(n3)O(n^3)

判断每一个点k,然后再找i,j

dot(i,k)联通dot(i,k)联通 dot(j,k)联通dot(j,k)联通 dot[i][k]+dot[k][j]<dot[i][j]dot[i][k]+dot[k][j]<dot[i][j]

满足以上三个条件久会更新

void Floyd(){
	for(int k=0;k<n;k++){//每个要考虑的点
		for(int i=0;i<n;i++){//起点
			for(int j=0;j<n;j++){//终点
				if(dot[i][k]!=INT_MAX&&dot[k][j]!=INT_MAX&&dot[i][k]+dot[k][j]<dot[i][j]){
					dot[i][j]=dot[i][k]+dot[k][j];
				}
				
			
			}
		}
	}
	
}

完整代码

#include<bits/stdc++.h>

using namespace std;
int n,m;
int dot[123][123];
void init(){
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dot[i][j]=INT_MAX;
	return ;
}
void Floyd(){
	for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
		if(dot[i][k]!=INT_MAX&&dot[k][j]!=INT_MAX&&dot[i][j]>dot[i][k]+dot[k][j]){
			dot[i][j]=dot[i][k]+dot[k][j];
		}
	}	
	return ;
}
int main(){
	cin>>n>>m;
	int a,b,c,temp;
	init();
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		temp=min(min(dot[a][b],dot[b][a]),c);
		dot[a][b]=temp;
		dot[b][a]=temp;
	}
	Floyd();
	for(int i=1;i<=n;i++){	
		for(int j=1;j<=n;j++){
			if(i==j)cout<<"0 ";
			else cout<<dot[i][j]<<' ';
		}
		cout<<endl;
	}
	
	
	
	
	return 0;
}
#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
using namespace std;

//第一章:创建变量
int flag[20][3]={};//1:是否存活,2:是否上挂,3:是否出过中pig,4:连续哈哈的次数
int protect[5][3]={};//盾、钟
string gun[15][10]={
	{"玉","防","闪","甩剑",},{"戳","双戳","三戳","四戳"},{"暴击","重击","痛击","马丁","百变马丁"},{"重拳","天地","无向","马丁","百变马丁"},{"小猪","中猪","大猪","无猪","聪明无猪"},{"小电","中电","大电","雷神"},{"斩","元气斩","猪油斩"},{"狒狒(4玉1.5防)","狒狒(2.5甩剑)","暗黑狒狒","banana","dark-banana"},{"黑洞","白洞","虫洞","a","a"},{"CSP-J","CSP-S","NOIP","NOI","IOI"}
};
int player[50][5]={};//玩家的每个攻击的数量
double basic[20][3]={};//yu,fang,shuai,shan
struct fire{
	int f,hh,sh;//能否防,能否哈哈,能否闪 
	double hurt;//伤害 
	double yu,fang,shuai,dian;//价格
}tool[50];

//第二章:初始化数据
void SetPos(int x,int y){
	COORD pos; pos.X=y*2-1,pos.Y=x+1;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void Color(int a){
	if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
	if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
	if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
	if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
	if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
	if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
	if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
	if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);
	if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
	
}
void init(){
	flag[1][1]=1;
	flag[1][2]=1;
	flag[2][1]=0;
	flag[2][2]=0;
	flag[3][1]=0;
	flag[3][2]=0;
	flag[4][1]=0;
	flag[4][2]=0;
	
	protect[1][1]=0;
	protect[1][2]=0;
	protect[2][1]=0;
	protect[2][2]=0;
	
	for(int i=0;i<50;i++)for(int j=0;j<5;j++)player[i][j]=0;
	
	tool[1]={1,0,1,0.5,0.5};//ber
	tool[2]={0,0,1,0.5};//2ber
	tool[3]={0,0,1,1};//3ber
	tool[4]={0,0,1,2};//4ber
	
	tool[6]={0,1,0,0.6,1,1};//baoji
	tool[7]={0,1,0,1};//zhongji
	tool[8]={0,0,0,2};//tongji
	tool[9]={0,0,0,4};//mading1
	tool[10]={0,0,0,8};//baibian-mading1
	
	tool[11]={0,0,0,0.5,1.5};//zhongquan
	tool[12]={0,0,0,1};//tiandi
	tool[13]={0,0,0,2};//wuxiang
	tool[14]={0,0,0,4};//mading
	tool[15]={0,0,0,8};//baibian-mading
	
	tool[16]={1,1,0,0.5,1};//pig
	tool[17]={0,1,0,1};//midpig
	tool[18]={0,0,0,2};//hugepig
	tool[19]={0,0,0,4};//no_pig
	tool[20]={0,0,0,8};//smart_no_pig
	
	tool[21]={1,0,1,0.5,0,0,0,1.5};//dian
	tool[22]={0,0,1,1};//mid_dian
	tool[23]={0,0,0,2};//big_dian
	tool[24]={0,0,0,4};//lightening
	
	tool[26]={1,1,0,0.5,0.5,0.5};//zhan
	tool[27]={0,1,0,0.5};//yuanqi
	tool[28]={0,0,0,1};//zhuyou
	
	tool[31]={0,0,0,3.5,4,1.5};//feifei1
	tool[32]={0,0,0,3.5,0,0,2.5};//feifei2
	tool[33]={0,0,0,7};//anheifeifei
	
	tool[37]={0,1,0,1};//whitehole;
	tool[38]={0,0,0,2};//chongdong
	
	tool[41]={1,1,0,0.5};//J
	tool[42]={0,1,0,1};//S
	tool[43]={0,0,0,2};//NOIP
	tool[44]={0,0,0,4};//NOI
	tool[45]={0,0,0,8};//IOI
}
void Slowsay(string a){
	int l=a.size();
	for(int i=0;i<l;i++){
		cout<<a[i];
		Sleep(2);
	}
	printf("\n");
}
void fiveSeconds(){
	int timeup=5;
	Color(5);
	while(timeup--){
		cout<<timeup+1<<"秒后游戏继续"<<endl;
		Sleep(1000);
	}
	Color(8);
	return ;
}


//第三章:游戏第一层界面
void start_(){
	SetPos(1,4),Color(2),cout<<"欢迎初一3班的热门游戏"<<endl;
	SetPos(2,5),Color(6),cout<<"强力克制作弊大师"<<endl;
	SetPos(3,6),Color(1),cout<<"制作:HF0310"<<endl;
	SetPos(4,2),Color(5),cout<<"更新系列(当前版本:1.1)";
	Color(8),cout<<"1键"<<endl;
	SetPos(5,2),Color(4),cout<<"人机对打(未开发)       ";
	Color(8),cout<<"2键"<<endl;
	SetPos(6,2),Color(3),cout<<"双人对战(不能联机)     ";
	Color(8),cout<<"3键"<<endl;
	SetPos(7,2),Color(7),cout<<"退出游戏(本游戏没存档) ";
	Color(8),cout<<"4键"<<endl;
}
void _story(){
	char choose;
	Color(7),Slowsay("          作者介绍");
	Color(2),Slowsay("初一三班:hfoj.net/blog/1918");
	Color(6),Slowsay(" 禁止改编或者放入自己的博客");
	Color(3),Slowsay("          更新日志");
	Color(1),Slowsay("     v1.0  2025年2月27日");
	Color(8),Slowsay("         创建此界面");
	Color(1),Slowsay("     v1.1  2025年?月?日");
	Color(8),Slowsay("   完成基础玩法:双人对决");
	Color(1),Slowsay("      即将更新的模式");
	Color(8),Slowsay("   开局加入护盾、钟以及蕉");
	Color(8),Slowsay("   玩家(们)可以自己定义");
	Color(5),Slowsay("     按下a回到主界面");
	while(choose!='a')choose=_getch();
	system("cls");
	return ;
}
void not_write(){
	Color(1);
	Slowsay("都说了没开发了你TM还点");
	Color(8);
	Sleep(3000);
}


//第四章到第十一章是双人玩法

//第四章:基础物资
string __basic(int x){
	int choose;
	Color(2);
	Slowsay("基础物资系列如下");
	Sleep(500);
	for(int i=0;i<=3;i++){
		Color(8);
		cout<<gun[0][i]<<':';
		Color(7);
		cout<<basic[i][x]<<(i==3?"  ":"    ");
		Color(1);
		cout<<"按"<<i+1<<"键"<<endl;
		Sleep(500);
	}
	Color(8);
	cin>>choose;
	if(choose!=1&&choose!=2&&choose!=3&&choose!=4){
		Color(4);
		Slowsay("无效输入,即将返回上一层");
		Color(8);
		Sleep(1500);
		return "";
	}
	basic[choose-1][x]++;
	cout<<"完成,你现在有";
	cout<<basic[choose-1][x];
	cout<<"个";
	cout<<gun[0][choose-1];
	Sleep(500);
	return gun[0][choose-1];
}

//第五章:攻击方式
//九种攻击道具
void chuo(int flag){
	not_write();
}
void baoji(int flag){
	not_write();
}
void zhongqvan(int flag){
	not_write();
}
void pig(int flag){
	not_write();
}
void dian(int flag){
	not_write();
}
void zhan(int flag){
	not_write();
}
void feifei(int flag){
	not_write();
}
void hole(int flag){
	not_write();
}
void mobai(int flag){
	not_write();
	
}
//攻击界面
string __fight(int x,int y){
	//x表示玩家编号,y表示出的攻击方式
	system("cls");
	int answer;
	cin>>answer;
	bool flag=false;
	Color(8);
	Slowsay("你选择的系攻击手段如下:");
	if(answer==1)chuo(flag);
	if(answer==2)baoji(flag);
	if(answer==3)zhongqvan(flag);
	if(answer==4)pig(flag);
	if(answer==5)dian(flag);
	if(answer==6)zhan(flag);
	if(answer==7)feifei(flag);
	if(answer==8)hole(flag);
	if(answer==9)mobai(flag);
	return "";
}

//第六章:防具
string __protect(int x){
	int f1=basic[1][x],f2=protect[1][x]/2;
	int choose;
	Color(2),cout<<"防具系列"<<endl;
	Sleep(250);
	Color(8),cout<<"你有"<<basic[1][x]<<"个防"<<endl;
	Sleep(250);
	Color(1),cout<<"你有"<<protect[1][x]<<"个盾"<<endl;
	Sleep(250);
	Color(7),cout<<"你有"<<protect[2][x]<<"个钟"<<endl;
	Sleep(500);
	if(f1)Color(1),cout<<"按1购买盾,当前够买"<<f1<<"个"<<endl;
	else Color(4),cout<<"没有足够的防来买盾,1个防买1个盾"<<endl;
	Sleep(250);
	if(f2)Color(7),cout<<"按2购买钟,当前够买"<<f2<<"个"<<endl;
	else Color(4),cout<<"没有足够的盾来买钟,2个盾买1个钟"<<endl;
	Color(8);
	cin>>choose;
	if(choose==1&&f1){
		basic[1][x]-=1;
		protect[1][x]++;
		Color(1),cout<<"完成,你现在有"<<protect[1][x]<<"个盾";
		Sleep(500);
		Color(8);
		return "盾";
	}else if(choose==2&&f2){
		protect[2][x]++;
		protect[1][x]-=2;
		Color(1),cout<<"完成,你现在有"<<protect[2][x]<<"个钟";
		Sleep(500);
		Color(8);
		return "钟";
	}else{
		Color(4);
		Slowsay("输入失败,即将返回上一层");
		Sleep(1500);
		Color(8);
		return "";
	}
	return "";
}

//第七章
string __prop(int x){
	int choose;
	Color(2),Slowsay("请输入特殊道具的编号");
	Color(1),Slowsay("这些道具在关键时能发挥作用");
	Color(3),cout<<"你现在";
	Sleep(10);
	if(flag[2][x]==0)cout<<"不";
	Slowsay("处于上挂状态");
	Color(7);
	if(!flag[2][x])Slowsay("1:上挂(无敌开关)");
	else Slowsay("2:下挂(再不跑可能就没了)");
	Slowsay("3:举报(预判大师)\n4:哈哈(反弹部分猪、斩、膜拜以及暴击)");
	Color(8);
	cin>>choose;
	if(choose!=flag[2][x]+1&&choose!=3&&choose!=4){
		Color(4);
		system("cls");
		Slowsay("无效输入,即将返回上一层");
		Color(8);
		Sleep(1500);
		return "";
	}if(choose==3){
		Color(1),Slowsay("举报成功,任何玩家上挂时死亡");
		Color(8);
		Sleep(500);
		system("cls");
		return "举报";
	}else if(choose==4){
		flag[4][x]++;
		Color(1),Slowsay("完成,小心不要连续三次哈哈");
		Color(8);
		Sleep(500);
		system("cls");
		return "哈哈";
	}else if(choose==1&&flag[2][x]==0){
		flag[2][x]=1;
		Color(6),Slowsay("上挂成功,记得下来");
		Color(8);
		Sleep(500);
		system("cls");
		return "上挂";
	}else if(choose==2&&flag[2][x]==1){
		flag[2][x]=0;
		Color(6),Slowsay("下挂成功,一切恢复了往日的和平");
		Color(8);
		system("cls");
		return "下挂";
	}else{
		
	}
	return "";
}

//第八章:上挂状态的特殊判定(未完成)


//第九章:任意玩家的游戏界面
void gameboard(int x){
	Color(2),Slowsay("请选择你本回合的动作");
	Sleep(250);
	Color(1);
	cout<<"当前有"<<basic[0][x]<<"个玉;"<<basic[1][x]<<"个防;"<<basic[2][x]<<"个甩剑和"<<basic[3][x]<<"个闪"<<endl;
	Color(6);
	Sleep(250);
	cout<<protect[1][x]<<"个护盾和"<<protect[2][x]<<"个钟"<<endl;
	Sleep(250);
	cout<<"对方有"<<protect[1][3-x]<<"个护盾和"<<protect[2][3-x]<<"个钟"<<endl;
	Sleep(250);
	Color(8),Slowsay("基础物资(玉、防、闪和甩剑)(0)");
	Color(7),Slowsay("戳系(1)\n暴击系(下面也有马丁)(2)\n重拳系(上面也有马丁)(3)\n猪系(4)\n电系(5)\n斩系(基本没用)(6)\n狒狒系(有两种蕉)(7)\n洞系(有黑洞)(8)\n膜拜系(9)");
	Color(5),Slowsay("其它道具(上下挂、举报、哈哈)(10)");
	Color(3),Slowsay("防护道具(前台盾和前台钟)(11)");
	Color(8);
}


//第十章:本回合伤害结算
void thisround(string s1,string s2){
	bool isUp=false;
	int timeup=5;
	system("cls");
	Color(2);
	Slowsay("在本回合中");
	Color(8);
	Sleep(500);
	cout<<"玩家1出了"<<s1<<endl;
	Sleep(500);
	cout<<"玩家2出了"<<s2<<endl;
	
	//举报判定
	if(s1=="举报"||s2=="举报"){
		Color(3),Slowsay("某个玩家打出了举报,现在开始判定。");
		Sleep(1000);
		if(flag[2][1]==1){
			Color(4);
			Slowsay("玩家1上挂了,血量清零");
			flag[1][1]=0;
			isUp=true;
		}if(flag[2][2]==1){
			Color(4);
			Slowsay("玩家2上挂了,血量清零");
			flag[2][1]=0;
			isUp=true;
		}
		if(isUp==false){
			Color(2);
			Slowsay("没有人上挂,游戏继续");
		}
		Color(8);
	}
	if(isUp==true){
		Color(8);
		Sleep(2000);
		fiveSeconds();
		return ;
	}else{
		Sleep(500);
	}
	//哈哈判定
	if(flag[4][1]==3||flag[4][2]==3){
		Color(3),Slowsay("某个玩家连续哈哈三次,现在开始判定。");
		Sleep(1000);
		if(flag[4][1]==3){
			Color(4);
			Slowsay("玩家1打出了3次,生命数-1");
			flag[4][1]=0;
			flag[1][1]--;
		}if(flag[4][2]==3){
			Color(4);
			Slowsay("玩家2打出了3次,生命数-1");
			flag[4][2]=0;
			flag[1][2]--;
		}
		Color(8);
		fiveSeconds();
		return;
	}	
	//伤害判定
	
	
	
	
	
	
	fiveSeconds();
	Color(8);
	return ;
}

//第十一章:双人对决游戏面板
void game(){
	int answer;
	int timeup=5;
	string s1,s2;
	char choose;
	while(1){
		//过渡
		system("cls");
		Slowsay("请玩家2离开屏幕,输入任意键后按回车");
		cin>>choose;
		//玩家1
		while(s1==""){
			system("cls");
			gameboard(1);
			cin>>answer;
			system("cls");
			if(answer==0){
				s1=__basic(1);
			}else if(answer==10){
				s1=__prop(1);
			}else if(answer==11){
				s1=__protect(1);
			}else{
				s1=	__fight(1,answer);
			}
		}
		//过渡
		system("cls");
		Slowsay("请玩家2来到屏幕,输入任意键后按回车");
		cin>>choose;
		//玩家2
		while(s2==""){
			system("cls");
			gameboard(2);
			cin>>answer;
			system("cls");
			if(answer==0){
				s2=__basic(2);
			}else if(answer==10){
				s2=__prop(2);
			}else if(answer==11){
				s2=__protect(2);
			}else{
				s2=__fight(2,answer);
			}
		}
		
		system("cls");
		thisround(s1,s2);
		
		//检测游戏是否结束
		if(flag[2][1]&&flag[2][2]){
			system("cls");
			Color(8);
			Slowsay("两人同时上挂,本次游戏平局");
			break;
		}else if(flag[1][1]>=3&&flag[1][2]>=3){
			system("cls");
			Color(8);
			Slowsay("每人不小于3条命,本次游戏平局");
			break;
		}else if(flag[1][1]==0&&flag[1][2]>0){
			system("cls");
			Color(8);
			Slowsay("玩家1被打死");
			break;
		}else if(flag[1][1]>0&&flag[1][2]==0){
			system("cls");
			Color(8);
			Slowsay("玩家2被打死");
			break;
		}
		if(s1!="哈哈")flag[4][1]=0;
		if(s2!="哈哈")flag[4][2]=0;
		s1="";
		s2="";
	}
	Color(5);
	while(timeup--){
		cout<<timeup+1<<"秒后回到主界面"<<endl;
		Sleep(1000);
	}
	system("cls");
	Color(8);
}
char choose;

//第十二章:主函数
int main(){
	init();
	while(1){
		start_();
		choose=_getch();
		if(choose=='1'){
			system("cls");
			_story();
		}else if(choose=='2'){
			system("cls");
			not_write();
		}else if(choose=='3'){
			Sleep(1000);
			game();
			init();
		}else if(choose=='4'){
			system("cls");
			Color(2),Slowsay("goodbye");
			Color(8);
			break;
		}
		Color(8);
	}
	return 0;
}

/*
目标:
1:编写上挂状态的行动,可以选择加入到4~11章的函数中(前缀:编写攻击)
2:编写50+种攻击方式(0/10类)
3:编写游戏规则(选)
4:每回合的伤害判定。如:是否有伤害(bool),伤害大小,两位玩家的前台
*/