桐人的约会【SPFA】

>Description
共有N个街区和M条道路,每条道路连接两个不同的街区,并且通过一条道路需要花费一些时间。从1号街区赶往N号街区,并且你要选择一条道路不能通行,不过不论是哪条道路不能通行,均存在一条路径可以从1号街区前往N号街区,而且亚丝娜一定会选取最短路前往N号街区。亚丝娜最多要花费多长的时间才能到达N号街区。


>Input
第1行:两个正整数N,M,N表示街区个数,M表示道路数。
第2到M+1行 每行三个整数 u,v,w 表示存在一条连接u和v的道路,通过这条道路花费的时间为w
数据保证没有重边和自环

>Output
一个整数,表示最多花费的时间。


>Sample Input
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10

>Sample Output
27

【数据规模】
30% N<=5, M<=10
60% N<=1000,M<=10000,w=1
100% N<=1000, M<=N*(N-1)/2,1<=w<=1000


>解题思路
首先要用SPFA算出从1到n的最短路,并且要记录路径。
然后再枚举这条路径上的各个点不能通行的情况(因为如果是除最短路径外的其他的不能通行的话,亚丝娜肯定会走最短路径,所以只用枚举最短路径上的点),算出最长时间。


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct ooo
{
	int to,next;
}a[1000005];
int n,m,u,v,w,h[1005],t,f[1005][1005],st[3005],head,tail,lhq[1005],c[1005],tt,ans;
bool yy[1005];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		a[++t].to=v; a[t].next=h[u]; h[u]=t;
		a[++t].to=u; a[t].next=h[v]; h[v]=t;
		f[u][v]=f[v][u]=w;
	}
	memset(c,0x7f,sizeof(c));
	c[1]=0; st[1]=1; yy[1]=1; head=0; tail=1;
	do
	{
		head++;
		for(int i=h[st[head]];i;i=a[i].next)
		if(c[st[head]]+f[st[head]][a[i].to]<c[a[i].to])
		{
			lhq[a[i].to]=st[head]; //记录最短路径:表示当前点从哪个点过来
		 	c[a[i].to]=c[st[head]]+f[st[head]][a[i].to];
		 	if(!yy[a[i].to])
		 	{
		 		st[++tail]=a[i].to;
		 		yy[a[i].to]=1;
		 	}
		}
		yy[st[head]]=0;
	}while(head<tail);
	ans=c[n]; tt=n;
	for(int k=lhq[n];k;k=lhq[k]) //枚举每个点
	{
		memset(c,0x7f,sizeof(c)); //每次都要处理
	    c[1]=0; st[1]=1; yy[1]=1; head=0; tail=1;
	    do
	    {
		    head++;
		    for(int i=h[st[head]];i;i=a[i].next)
		     if(st[head]!=k||a[i].to!=tt) //特判:这条路不能通行
		     if(c[st[head]]+f[st[head]][a[i].to]<c[a[i].to])
		     {
		 	    c[a[i].to]=c[st[head]]+f[st[head]][a[i].to];
		 	    if(!yy[a[i].to])
		 	    {
		 		    st[++tail]=a[i].to;
		 		    yy[a[i].to]=1;
		 	    }
		     }
		     yy[st[head]]=0;
	    }while(head<tail); //算出最短路径
	    tt=k;
	    if(c[n]!=c[0]) ans=max(ans,c[n]);
	}
	printf("%d",ans);
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您写一个关于刀剑神域进击篇剧场版的网页,并且添加CSS样式,让内容更加丰富。以下是网页的代码: ```html <!DOCTYPE html> <html> <head> <title>刀剑神域进击篇剧场版</title> <style> body { background-color: #f2f2f2; font-family: Arial, sans-serif; margin: 0; padding: 0; } header { background-color: #cc0000; color: #fff; padding: 20px; text-align: center; } h1, h2 { margin: 0; padding: 20px; } h1 { font-size: 36px; text-align: center; } h2 { font-size: 24px; color: #cc0000; } section { margin: 20px auto; max-width: 800px; padding: 20px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); } section p { font-size: 18px; line-height: 1.5; text-align: justify; } img { display: block; margin: 0 auto; max-width: 100%; height: auto; } ul { margin: 0; padding: 0; list-style: none; } li { padding: 10px; border-bottom: 1px solid #ccc; } li a { color: #cc0000; text-decoration: none; } li a:hover { text-decoration: underline; } </style> </head> <body> <header> <h1>刀剑神域进击篇剧场版</h1> <p>这是一部非常值得一看的电影,敬请期待!</p> </header> <section> <h2>剧情简介</h2> <p>刀剑神域进击篇剧场版是由A-1 Pictures制作,于2017年2月18日在日本上映的电影。本片是刀剑神域第二季的续篇,讲述了桐人和亚丝娜被困在了一个名为“Underworld”的虚拟现实游戏中,并且他们必须打败强大的敌人才能逃离游戏。</p> <p>这部电影的故事情节非常紧凑,动作场面非常精彩,让观众看得非常过瘾。</p> <img src="https://img1.baidu.com/it/u=250706890,3126592176&fm=26&fmt=auto" alt="刀剑神域进击篇剧场版"> </section> <section> <h2>主要角色</h2> <ul> <li><a href="#">桐人</a> - 游戏玩家,被困在Underworld游戏中。</li> <li><a href="#">亚丝娜</a> - 游戏玩家,和桐人一起被困在Underworld游戏中。</li> <li><a href="#">尤吉欧</a> - Underworld游戏中的一位强大的敌人。</li> <li><a href="#">艾吉尔</a> - 游戏开发者,负责Underworld游戏的制作。</li> </ul> </section> <section> <h2>影片评价</h2> <p>刀剑神域进击篇剧场版在日本上映后大获成功,并且在全球范围内拥有了大量的粉丝。观众们对这部电影的评价非常高,认为它是一部非常值得一看的电影。</p> <p>影评人评论道:“刀剑神域进击篇剧场版的剧情非常紧凑,动作场面精彩,让观众看得非常过瘾。如果你是一个动漫迷,那么你一定不能错过这部电影。”</p> </section> <footer> <p>© 2021 刀剑神域进击篇剧场版. All Rights Reserved.</p> </footer> </body> </html> ``` 这个网页使用了一些CSS样式来美化页面。例如,设置了背景颜色,字体样式和大小,图片居中等。此外,还添加了剧情简介、主要角色和影片评价等内容,让网页更加丰富。您可以将此代码复制到您的编辑器中,并保存为.html文件来查看效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值