USACO14FEB Roadblock

题目地址

题解

先跑一次最短路,然后对最短路上的边进行操作即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int mp[105][105],E,V,vis[105],d[105],pre[105];
void dijkstra(int o){
int lst,at,i,j;
fill(d,d+V,INF);
memset(vis,0,sizeof(vis));
if(o)memset(pre,-1,sizeof(pre));
d[0]=0;
for(i=0;i<V;i++){
for(lst=INF,j=0;j<V;j++)
if(!vis[j]&&d[j]<lst)at=j,lst=d[j];
vis[at]=1;
for(j=0;j<V;j++)
if(d[j]>d[at]+mp[at][j]){
d[j]=d[at]+mp[at][j];
if(o)pre[j]=at;
}
}
}
int main(){
scanf("%d%d",&V,&E);
memset(mp,0x3f,sizeof(mp));
int i,j,u,v,ans=0,rec;
for(i=0;i<E;i++)
scanf("%d%d%d",&u,&v,&j),
u--,v--,mp[u][v]=mp[v][u]=j;
dijkstra(1),rec=d[V-1];
for(i=V-1;i!=-1;i=pre[i])
if(pre[i]!=-1)
mp[i][pre[i]]<<=1,
mp[pre[i]][i]<<=1,
dijkstra(0),
ans=max(ans,d[V-1]-rec),
mp[i][pre[i]]>>=1,
mp[pre[i]][i]>>=1;
printf("%d\n",ans);
return 0;
}