码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur

时间:2017-09-08 22:58:51      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:spfa   oid   src   最大   ffffff   img   play   blank   ble   

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 }
View Code

 

洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur

标签:spfa   oid   src   最大   ffffff   img   play   blank   ble   

原文地址:http://www.cnblogs.com/chen74123/p/7496605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!