P1186 玛丽卡 删边求最长的最短路

题意:概括起来就是:删除任意最短路径上的边,然后求出最大的最短路

思路:0.0

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf=0x3f3f3f3f;
 4 const int maxn=1e3+10;
 5 int vis[maxn];int dis[maxn];
 6 int cut[maxn][maxn];
 7 int match[maxn];
 8 struct node
 9 {
10     int v,w,nxt;
11 }G[1000010]; int head[maxn]; int num;
12 void add(int u,int v,int w)
13 {
14     G[++num].v=v;G[num].w=w;G[num].nxt=head[u];head[u]=num;
15 }
16 void SPFA1()
17 {
18     queue<int>q;
19     memset(dis,inf,sizeof(dis));
20     memset(vis,0,sizeof(vis));
21     q.push(1);
22     vis[1]=1;
23     dis[1]=0;
24     while(!q.empty()){
25         int u=q.front();
26         q.pop();
27         vis[u]=0;
28         for(int i=head[u];i;i=G[i].nxt){
29             int v=G[i].v,w=G[i].w;
30             if(dis[v]>dis[u]+w){
31                 dis[v]=dis[u]+w;
32                 match[v]=u;
33                 if(!vis[v]){
34                     q.push(v);
35                     vis[v]=1;
36                 }
37             }
38         }
39     }
40 }
41 void SPFA2()
42 {
43     queue<int>q;
44     memset(dis,inf,sizeof(dis));
45     memset(vis,0,sizeof(vis));
46     q.push(1);
47     vis[1]=1;
48     dis[1]=0;
49     while(!q.empty()){
50         int u=q.front();
51         q.pop();
52         vis[u]=0;
53         for(int i=head[u];i;i=G[i].nxt){
54             int v=G[i].v,w=G[i].w;
55             if(cut[u][v]) continue;
56             if(dis[v]>dis[u]+w){
57                 dis[v]=dis[u]+w;
58                 if(!vis[v]){
59                     q.push(v);
60                     vis[v]=1;
61                 }
62             }
63         }
64     }
65 }
66 int main()
67 {
68     int n,m;
69     scanf("%d%d",&n,&m);
70     for(int i=1;i<=m;i++){
71         int u,v,w;
72         scanf("%d%d%d",&u,&v,&w);
73         add(u,v,w);
74         add(v,u,w);
75     }
76     SPFA1();
77     int now=n;
78     int ans=dis[n];
79     while(match[now]){
80         int u=now;int v=match[now];
81         cut[u][v]=cut[v][u]=1;
82         SPFA2();
83         cut[u][v]=cut[v][u]=0;
84         ans=max(ans,dis[n]);
85         now=match[now];
86     }
87     printf("%d\n",ans);
88     return 0;
89 }
View Code

猜你喜欢

转载自www.cnblogs.com/pangbi/p/12722428.html