1. 程式人生 > >codeves 1021

codeves 1021

node return its 情況 del 足夠 然而 bold next

題目描述 Description

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

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

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

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

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

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

輸入描述 Input Description

第一行有兩個用空格隔開的數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分鐘內是就能通過。

輸出描述 Output Description

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

樣例輸入 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

思路:我們肯定想得到是將每一條路依次去掉,然後跑最短路求得最大值,然而我們發現我們去掉的肯定是最短路上面的那些邊,所以我們可以將這些邊標記起來.

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int Max=1002;
 4 const int INF=1e8;
 5 
 6 int n,p,c;//牛,牧場,道路//
 7 int a[Max],last[Max];
8 struct node{ 9 int from,to,next,val; 10 }e[Max*Max]; 11 int len,vis[Max],dis[Max]; 12 13 void add(int u,int v,int x){ 14 e[len].from=u; 15 e[len].to=v;e[len].next=last[u]; 16 e[len].val=x;last[u]=len++; 17 } 18 struct point 19 { 20 int val,id; 21 point(int id,int val):id(id),val(val){} 22 bool operator <(const point &x)const{ 23 return val>x.val; 24 } 25 }; 26 27 int fa[Max],del[Max*Max]; 28 void hh(bool k) 29 { 30 memset(vis,0,sizeof(vis)); 31 memset(dis,127,sizeof(dis)); 32 priority_queue<point> q; 33 q.push(point(1,0)); 34 dis[1]=0; 35 while(!q.empty()) 36 { 37 int cur=q.top().id; 38 int curr=q.top().val; 39 q.pop(); 40 if(vis[cur]) continue; 41 vis[cur]=true; 42 for(int i=last[cur];i!=-1;i=e[i].next) 43 { 44 int id=e[i].to; 45 if(!del[i]&&!vis[id] && curr+e[i].val < dis[id]) 46 { 47 if(k) fa[id]=i; 48 dis[id]=curr+e[i].val; 49 q.push(point(id,dis[id])); 50 } 51 } 52 } 53 } 54 int main() 55 { 56 int x,y,z; 57 scanf("%d%d",&n,&p); 58 memset(last,-1,sizeof(last)); 59 for(int i=1;i<=p;i++){ 60 scanf("%d%d%d",&x,&y,&z); 61 add(x,y,z); 62 add(y,x,z); 63 } 64 hh(true); 65 int ans=dis[n]; 66 for(int i=n;i!=1;i=e[fa[i]].from){ 67 del[fa[i]]=1;hh(false);del[fa[i]]=0; 68 ans=max(ans,dis[n]); 69 } 70 cout<<ans<<endl; 71 return 0; 72 }

codeves 1021