1. 程式人生 > >洛谷 P1186 瑪麗卡

洛谷 P1186 瑪麗卡

https emp mes pac 離開 pty 並且 sum 應該

P1186 瑪麗卡

題目描述

麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。

因為她和他們不住在同一個城市,因此她開始準備她的長途旅行。

在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從一個城市到另一個城市路上所需花費的時間。

麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路正在維修,從瑪麗卡所在的城市都能到達麥克所在的城市。

瑪麗卡將只從不堵車的路上通過,並且她將按最短路線行車。麥克希望知道在最糟糕的情況下瑪麗卡到達他所在的城市需要多長時間,這樣他就能保證他的女朋友離開該城市足夠遠。

編寫程序,幫助麥克找出瑪麗卡按最短路線通過不堵車道路到達他所在城市所需的最長時間(用分鐘表示)。

輸入輸出格式

輸入格式:

第一行有兩個用空格隔開的數N和M,分別表示城市的數量以及城市間道路的數量。1≤N≤1000,1≤M≤N*(N-1)/2。城市用數字1至N標識,麥克在城市1中,瑪麗卡在城市N中。

接下來的M行中每行包含三個用空格隔開的數A,B和V。其中1≤A,B≤N,1≤V≤1000。這些數字表示在A和城市B中間有一條雙行道,並且在V分鐘內是就能通過。

輸出格式:

輸出文件的第一行中寫出用分鐘表示的最長時間,在這段時間中,無論哪條路在堵車,瑪麗卡應該能夠到達麥克處,如果少於這個時間的話,則必定存在一條路,該條路一旦堵車,瑪麗卡就不能夠趕到麥克處。

輸入輸出樣例

輸入樣例#1:
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
輸出樣例#1:
27

思路:跑最短路枚舉刪邊,求出的最大的最短時間即為答案。
錯因:
1.數組問題,這已經是最近n次了,總是想偷懶而少設變量,不是MLE就是wa.
#include<deque>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 500100
#define
M 1100 using namespace std; int n,m,x,y,z,tot,sum,ans=-1; int vis[M],dis[M],pre[M],cutdian[MAXN*2]; int to[MAXN*2],net[MAXN*2],cap[MAXN*2],head[MAXN*2]; void add(int u,int v,int w){ to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot; to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot; } void clear(){ tot=0; memset(to,0,sizeof(to)); memset(net,0,sizeof(net)); memset(head,0,sizeof(head)); } void spfa(int s){ deque<int>que; memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); que.push_back(s); vis[s]=1;dis[s]=0; while(!que.empty()){ int now=que.front(); que.pop_front(); vis[now]=0; for(int i=head[now];i;i=net[i]){ if(cutdian[now*1001+to[i]]) continue; if(dis[to[i]]>dis[now]+cap[i]){ dis[to[i]]=dis[now]+cap[i]; if(!vis[to[i]]){ vis[to[i]]=1; if(!que.empty()&&dis[to[i]]>dis[que.front()]) que.push_back(to[i]); else que.push_front(to[i]); } if(!sum) pre[to[i]]=now; } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); } spfa(1); sum=1; int t=n; while(t){ cutdian[t*1001+pre[t]]=true; cutdian[pre[t]*1001+t]=true; spfa(1); ans=max(ans,dis[n]); cutdian[t*1001+pre[t]]=false; cutdian[pre[t]*1001+t]=false; t=pre[t]; } printf("%d",ans); }

洛谷 P1186 瑪麗卡