洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur
Posted Alex丶Baker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur相关的知识,希望对你有一定的参考价值。
P3119 [USACO15JAN]草鉴定Grass Cownoisseur
tarjan缩点,正反spfa,枚举边,更新最大值
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000 4 #define inf 0x3f3f3f3f 5 int n,m,x[maxn],y[maxn],z,num,head[maxn],head2[maxn],tim,ans,tot,dis1[maxn],dis2[maxn],head3[maxn]; 6 int sumcol,dfn[maxn],low[maxn],sumedge,Stack[maxn],point[maxn],top,color[maxn],dis[maxn],tot2; 7 bool vis[maxn]; 8 struct Edge{ 9 int u,v,d,next; 10 }edge[maxn],edge2[maxn],edge3[maxn]; 11 12 void add_edge(int u,int v) 13 { 14 edge[++num].v=v; 15 edge[num].next=head[u]; head[u]=num; 16 } 17 18 void ins(int u,int v) 19 { 20 edge2[++tot].u=u; 21 edge2[tot].v=v; 22 edge2[tot].next=head2[u]; 23 head2[u]=tot; 24 } 25 26 void ins2(int u,int v) 27 { 28 edge3[++tot2].u=u; 29 edge3[tot2].v=v; 30 edge3[tot2].next=head3[u]; 31 head3[u]=tot2; 32 } 33 34 int tarjan(int now) 35 { 36 dfn[now]=low[now]=++tim; 37 vis[now]=true; Stack[++top]=now; 38 for(int i=head[now];i;i=edge[i].next) 39 { 40 int t=edge[i].v; 41 if(vis[t]) low[now]=min(low[now],dfn[t]); 42 else if(!dfn[t]) tarjan(t),low[now]=min(low[now],low[t]); 43 } 44 if(low[now]==dfn[now]) 45 { 46 sumcol++,color[now]=sumcol,point[sumcol]++; 47 for(;Stack[top]!=now;top--) 48 color[Stack[top]]=sumcol,vis[Stack[top]]=false,point[sumcol]++; 49 vis[now]=false,top--; 50 } 51 } 52 53 void spfa(int s) 54 { 55 queue<int>que; 56 bool inq[maxn]; 57 for(int i=1;i<=sumcol;i++) dis[i]=-10000,inq[i]=false; 58 dis[s]=point[s]; inq[s]=1; 59 que.push(s); 60 while(!que.empty()) 61 { 62 int cur=que.front(); que.pop(); 63 for(int i=head2[cur];i;i=edge2[i].next) 64 { 65 int v=edge2[i].v; 66 if(dis[cur]+point[edge2[i].v]>dis[v]) 67 { 68 dis[v]=dis[cur]+point[edge2[i].v]; 69 if(!inq[v]) 70 { 71 inq[v]=1; 72 que.push(v); 73 } 74 } 75 } 76 inq[cur]=false; 77 } 78 } 79 80 void spfa2(int s) 81 { 82 queue<int>que; 83 bool inq[maxn]; 84 for(int i=1;i<=sumcol;i++) dis[i]=-10000,inq[i]=false; 85 dis[s]=point[s]; inq[s]=1; 86 que.push(s); 87 while(!que.empty()) 88 { 89 int cur=que.front(); que.pop(); 90 for(int i=head3[cur];i;i=edge3[i].next) 91 { 92 int v=edge3[i].v; 93 if(dis[cur]+point[edge3[i].v]>dis[v]) 94 { 95 dis[v]=dis[cur]+point[edge3[i].v]; 96 if(!inq[v]) 97 { 98 inq[v]=1; 99 que.push(v); 100 } 101 } 102 } 103 inq[cur]=false; 104 } 105 } 106 107 int main() 108 { 109 scanf("%d%d",&n,&m); 110 for(int i=1;i<=m;i++) 111 { 112 scanf("%d%d",&x[i],&y[i]); 113 add_edge(x[i],y[i]); 114 } 115 for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); 116 for(int u=1;u<=n;u++) 117 for(int i=head[u];i;i=edge[i].next) 118 if(color[u]!=color[edge[i].v]) 119 { 120 ins(color[u],color[edge[i].v]); 121 ins2(color[edge[i].v],color[u]); 122 } 123 spfa(color[1]); 124 for(int i=1;i<=sumcol;i++) dis1[i]=dis[i]; 125 spfa2(color[1]); 126 for(int i=1;i<=sumcol;i++) dis2[i]=dis[i]; 127 for(int i=1;i<=m;i++) 128 { 129 if(dis1[color[y[i]]]+dis2[color[x[i]]]>ans) 130 ans=dis1[color[y[i]]]+dis2[color[x[i]]]; 131 } 132 printf("%d\n",ans-point[color[1]]); 133 return 0; 134 }
以上是关于洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur
P3119 [USACO15JAN]草鉴定Grass Cownoisseur
P3119 [USACO15JAN]草鉴定Grass Cownoisseur
P3119 [USACO15JAN]草鉴定Grass Cownoisseur