2021.12.12 旅游

【题目描述】

 

某国有 N 个编号为 1 至 N 的城市和 M 条编号为 1 至 M 的公路。

 第 i 条公路是从城市 Ai通往城市 Bi的单向道路。

Tom 正在计划他的暑假旅程,他可以从某些城市出发,经过零条或多条道路旅行,最后 到达某些城市。

有多少对城市可以成为 Tom 旅程的起点和终点?我们以不同的顺序区分是否为同一对 城市。比如(2,3)和(3,2)属于不同的 2 对。

【数据范围】

第一行输入两个整数 N(2≤N≤2000)和 M(0≤N≤min(2000,N(N-1)))。 接下来有 M 行,每行有 2 个整数 Ai和 Bi(1≤Ai,Bi≤N;Ai≠Bi),表示从 Ai到 Bi有一条 单向道路。输入的所有数对(Ai,Bi)都不相同。

Floyd主要是求解图的连通和最短路的问题,和迪杰斯特拉和SPFA不同(我都搞忘了,还是要复习啊),后两个是求单源最短路,而Floyd是求图中每个点到其他点的最短路,这是不同于后两个的地方,但是Floyd算法时间复杂度极高,可达O(n^{3}),只可用于小范围数据

下面是Floyd 25/100的“高分”代码

#include<bits/stdc++.h>
using namespace std;
int f[2005][2002];
int n,m,ans;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		f[a][b]=1;
	}
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				f[i][j]=f[i][j]||(f[i][k]&f[k][j]);
			}
		}
	}
	for(int i=1;i<=n;i++)//枚举起点
	for(int j=1;j<=n;j++)//枚举终点 
	{
		if(f[i][j]) ans++; 
	} 
	ans+=m//自己可以同时作为起点和终点 
	cout<<ans;
	return 0;
} 

 Floyd虽然是可行的,但是限于本题题目数据限制,只能另寻它法

其实,可以用简单的DFS遍历整个图,用循环枚举每个点作为起点,换成单源问题求连通,这样已转化就不难了

每次枚举完一个起点就统计一次

附上AC正解代码

#include<bits/stdc++.h>
using namespace std;
const int N=10050;
int first[N],nex[N],to[N],tot;
int n,m;
int ans;
bool p[N];
void add(int x,int y)
{
	nex[++tot]=first[x];
	first[x]=tot;
	to[tot]=y;
}
void find(int x)
{
	p[x]=true;//走过的标记
	for(int e=first[x];e;e=nex[e])//枚举由x出发的边
	{
		int y=to[e];
		if(p[y]) continue;
		find(y);
	} 
} 
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		add(a,b);//建立a到b的有向图 
	}
	for(int i=1;i<=n;i++)
	{
		memset(p,0,sizeof(p));//每次循环要把标记全部清零
		find(i);//i做起点
		for(int j=1;j<=n;j++)
		{
			ans+=p[j];
		} 
	} 
	cout<<ans;
	return 0;
}

还是要多练习啊 

以下是一个简单的旅游网页代码,包括一些常用的HTML和CSS元素,以及一些JavaScript功能,例如动态地显示时间和日期: ```html <!DOCTYPE html> <html> <head> <title>旅游网页</title> <style> body { background-color: #f2f2f2; font-family: Arial, sans-serif; margin: 0; padding: 0; } header { background-color: #333; color: #fff; padding: 20px; text-align: center; } h1 { margin: 0; font-size: 36px; } nav { background-color: #ddd; padding: 10px; } nav a { color: #333; font-size: 18px; margin-right: 20px; text-decoration: none; } nav a:hover { color: #333; text-decoration: underline; } section { padding: 20px; } section h2 { font-size: 24px; margin: 0 0 20px; } section p { font-size: 18px; line-height: 1.5; margin: 0 0 20px; } footer { background-color: #333; color: #fff; padding: 20px; text-align: center; } .clock { font-size: 24px; font-weight: bold; margin: 20px 0; text-align: center; } </style> </head> <body> <header> <h1>旅游网页</h1> </header> <nav> <a href="#">首页</a> <a href="#">旅游攻略</a> <a href="#">景点介绍</a> <a href="#">酒店预订</a> <a href="#">联系我们</a> </nav> <section> <h2>欢迎来到旅游网页</h2> <p>这里提供最新的旅游攻略和景点介绍,帮助您轻松计划旅行行程。</p> <div class="clock"></div> </section> <footer> <p>版权所有 © 2021 旅游网页</p> </footer> <script> function showTime() { var date = new Date(); var hours = date.getHours(); var minutes = date.getMinutes(); var seconds = date.getSeconds(); var meridiem = "AM"; if (hours > 12) { hours = hours - 12; meridiem = "PM"; } if (hours == 0) { hours = 12; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } var timeString = hours + ":" + minutes + ":" + seconds + " " + meridiem; document.querySelector(".clock").innerHTML = timeString; } showTime(); setInterval(showTime, 1000); </script> </body> </html> ``` 这个网页包括一个标题、一个导航菜单、一个欢迎信息、一个时钟和一个页脚。您可以根据需要修改和扩展代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值