生活随笔
收集整理的這篇文章主要介紹了
桐人的约会
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
這是一個風和日麗的日子,桐人和詩乃在約會。他們所在的城市共有N個街區,和M條道路,每條道路連接兩個不同的街區,并且通過一條道路需要花費一些時間。他們現在處于N號街區,正在享受幸福時光的桐人完全忘記了他的手機被亞絲娜安裝了監控裝置的事情,此時亞絲娜已經得知了桐人的位置以及他正在和一個妹子約會的事實,十分憤怒,于是從她所在的1號街區火速趕往N號街區。現在這個城市中有一條道路正在維修,不能通行,不過不論是哪條道路處于維修中,均存在一條路徑可以從1號街區前往N號街區,而且亞絲娜一定會選取最短路前往N號街區。現在你很好奇,桐人的美好時光最多還能持續多久,即亞絲娜最多要花費多長的時間才能到達N號街區。
輸入
第1行:兩個正整數N,M,N表示街區個數,M表示道路數。
第2到M+1行 每行三個整數 u,v,w 表示存在一條連接u和v的道路,通過這條道路花費的時間為w
數據保證沒有重邊和自環
輸出
一個整數,表示最多花費的時間。
輸入樣例
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
輸出樣例
27
說明
【數據規模】
30% N<=5, M<=10
60% N<=1000,M<=10000,w=1
100% N<=1000, M<=N*(N-1)/2,1<=w<=1000
.
.
.
.
.
分析
如果存在一條路徑會影響1至n的最短路,那么這段路徑一定存在于最短路上 ,所以找一條最短路,并枚舉去掉的路徑,找最短路中的最長路。
.
.
.
.
.
程序:
#include <stdio.h>
#include <string.h>
#include <queue>
#define maxn 1000
using namespace std;int ls[2000001],zd[1001],cnt=0;struct edge
{int to,w,next,wz,bz;
}e[2000001];void add(int x,int y,int w)
{e[++cnt].to=y;e[cnt].w=w;e[cnt].next=ls[x];e[cnt].wz=cnt+1;e[cnt].bz=0;ls[x]=cnt;e[++cnt].to=x;e[cnt].w=w;e[cnt].next=ls[y];e[cnt].wz=cnt-1;e[cnt].bz=0;ls[y]=cnt;
}int spfa(int s,int t,int flag)
{int d[1001];bool v[1001];memset(d,0x3f,sizeof(d));memset(v,false,sizeof(v));queue<int>q;q.push(s);d[s]=0;v[s]=true;while (!q.empty()){int tp=q.front();q.pop();for (int i=ls[tp];i;i=e[i].next)if (e[i].w+d[tp]<d[e[i].to]&&!e[i].bz){d[e[i].to]=d[tp]+e[i].w;if (flag==0) zd[e[i].to]=tp;if (!v[e[i].to]){v[e[i].to]=true;q.push(e[i].to);}}v[tp]=false;}return d[t];
}
int main()
{int n,m;scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);}spfa(1,n,0);int ans=0;for (int i=n;i;i=zd[i]){for (int j=ls[i];j;j=e[j].next)if (e[j].to==zd[i]){e[j].bz=e[e[j].wz].bz=1;int s=spfa(1,n,1);if (s>ans) ans=s;e[j].bz=e[e[j].wz].bz=0;}}printf("%d",ans);return 0;
}
轉載于:https://www.cnblogs.com/YYC-0304/p/10292840.html
總結
以上是生活随笔為你收集整理的桐人的约会的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。