zoukankan      html  css  js  c++  java
  • [SDOI2010]所驼门王的宝藏 --tarjan缩点+最长路

                                          [SDOI2010]所驼门王的宝藏

    题目描述

    在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族。被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖,外人也称其为“所驼门王”。所驼门王毕生致力于维护家族的安定与和谐,他曾亲自率军粉碎河蟹帝国主义的野蛮侵略,为族人立下赫赫战功。所驼门王一生财宝无数,但因其生性节俭低调,他将财宝埋藏在自己设计的地下宫殿里,这也是今天Henry Curtis故事的起点。Henry是一个爱财如命的贪婪家伙,而又非常聪明,他费尽心机谋划了这次盗窃行动,破解重重机关后来到这座地下宫殿前。

    整座宫殿呈矩阵状,由R×C间矩形宫室组成,其中有N间宫室里埋藏着宝藏,称作藏宝宫室。宫殿里外、相邻宫室间都由坚硬的实体墙阻隔,由一间宫室到达另一间只能通过所驼门王独创的移动方式——传送门。所驼门王为这N间藏宝宫室每间都架设了一扇传送门,没有宝藏的宫室不设传送门,所有的宫室传送门分为三种:

    1. “横天门”:由该门可以传送到同行的任一宫室;

    2. “纵寰门”:由该门可以传送到同列的任一宫室;

    3. “自 由门”:由该门可以传送到以该门所在宫室为中心周围8格中任一宫室(如果目标宫室存在的话)。

    深谋远虑的Henry当然事先就搞到了所驼门王当年的宫殿招标册,书册上详细记录了每扇传送门所属宫室及类型。而且,虽然宫殿内外相隔,但他自行准备了一种便携式传送门,可将自己传送到殿内任意一间宫室开始寻宝,并在任意一间宫室结束后传送出宫。整座宫殿只许进出一次,且便携门无法进行宫室之间的传送。不过好在宫室内传送门的使用没有次数限制,每间宫室也可以多次出入。

    现在Henry已经打开了便携门,即将选择一间宫室进入。为得到尽多宝藏,他希望安排一条路线,使走过的不同藏宝宫室尽可能多。请你告诉Henry这条路线最多行经不同藏宝宫室的数目。

    输入输出格式

    输入格式:

    输入文件sotomon.in第一行给出三个正整数N, R, C。

    以下N行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第xi行第yi列的藏宝宫室,类型为Ti。Ti是一个1~3间的整数,1表示可以传送到第xi行任意一列的“横天门”,2表示可以传送到任意一行第yi列的“纵寰门”,3表示可以传送到周围8格宫室的“自 由门”。 

    保证1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同。

    输出格式:

    输出文件sotomon.out只有一个正整数,表示你确定的路线所经过不同藏宝宫室的最大数目。

    输入输出样例

    输入样例#1:
    10 7 7
    2 2 1
    2 4 2
    1 7 2
    2 7 3
    4 2 2
    4 4 1
    6 7 3
    7 7 1
    7 5 2
    5 2 1
    输出样例#1:
    9


    题目给的你藏宝室的坐标
    需要你转化成图 --恶心

    同一行 同一列的可以相互到达
    在同一行中 横天门 都可以相互到达
    但是那样建图复杂度太高
    我们知道建好图还要缩点
    那么我们可以把同一行的 横天门 搞成一个环
    纵寰门 同理
    同一行或列 的横天门和纵寰门可以互相连边
    自 由门就暴力找周围8个格 就好了

    建图跑tarjan 在建一个新图 求最长路


    结构体排序一定把类型当做第二关键字 !!!--血的教训!! 我在这被坑了一下午!!!!

      1 #include <algorithm>
      2 #include <ctype.h>
      3 #include <cstdio>
      4 #include <queue>
      5 #include <map>
      6 
      7 using namespace std;
      8 
      9 const int MAXN=100010;
     10 const int INF=0x3f3f3f3f;
     11 
     12 int n,R,c,top,inr,id,ans;
     13 
     14 int stack[MAXN],belong[MAXN],dfn[MAXN],low[MAXN],sum[MAXN];
     15 
     16 struct SKT {
     17     int x,y;
     18     int type;
     19     int iden;
     20 };
     21 SKT Faker[MAXN];
     22 
     23 struct edge {
     24     int to;
     25     int next;
     26 };
     27 edge e[MAXN<<1],r[MAXN<<1];
     28 
     29 int head[MAXN],Head[MAXN],tot,lpo;
     30 
     31 int dis[MAXN],mark[MAXN];
     32 
     33 bool vis[MAXN];
     34 
     35 map<int,int> m[MAXN],o[MAXN];
     36 
     37 inline void read(int&x) {
     38     int f=1;register char c=getchar();
     39     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
     40     for(;isdigit(c);x=x*10+c-48,c=getchar());
     41     x=x*f;
     42 }
     43 
     44 inline int min(int x,int y) {return x<y?x:y;}
     45 
     46 inline int max(int x,int y) {return x>y?x:y;}
     47 
     48 inline bool cmp_X(SKT a,SKT b) {if(a.x==b.x) return a.type<b.type;return a.x<b.x;}
     49 
     50 inline bool cmp_Y(SKT x,SKT y) {if(x.y==y.y) return x.type<y.type;return x.y<y.y;}
     51 
     52 inline void add(int x,int y) {
     53     e[++tot].to=y;
     54     e[tot].next=head[x];
     55     head[x]=tot;
     56 }
     57 
     58 inline void readd(int x,int y) {
     59     r[++lpo].to=y;
     60     r[lpo].next=Head[x];
     61     Head[x]=lpo;
     62 }
     63 
     64 void tarjan(int u) {
     65     dfn[u]=low[u]=++inr;
     66     vis[u]=true;
     67     stack[++top]=u;
     68     for(int i=head[u];i;i=e[i].next) {
     69         int v=e[i].to;
     70         if(!dfn[v]) {
     71             tarjan(v);
     72             low[u]=min(low[u],low[v]);
     73         }
     74         else if(vis[v]) low[u]=min(low[u],dfn[v]);
     75     }
     76     if(dfn[u]==low[u]) {
     77         ++id;
     78         int t,s=0;
     79         do {
     80             t=stack[top--];
     81             vis[t]=false;
     82             ++s;
     83             belong[t]=id;
     84         }while(u!=t);
     85         sum[id]=s; 
     86     }
     87     return;
     88 }
     89 
     90 void dfs(int u) {
     91     mark[u]=1;
     92     for(int i=Head[u];i;i=r[i].next) {
     93         int v=r[i].to;
     94         if(!mark[v]) dfs(v);
     95         dis[u]=max(dis[u],dis[v]);
     96     }
     97     dis[u]+=sum[u];
     98     ans=max(ans,dis[u]);
     99     return;
    100 }
    101 
    102 int hh() {
    103 //    freopen("sdoi10sotomon.in","r",stdin);
    104 //    freopen("sdoi10sotomon.out","w",stdout);
    105     read(n);read(R);read(c);
    106     for(int i=1;i<=n;++i) 
    107       read(Faker[i].x),read(Faker[i].y),read(Faker[i].type),Faker[i].iden=i,
    108       m[Faker[i].x][Faker[i].y]=i;
    109     sort(Faker+1,Faker+n+1,cmp_X);
    110     for(int i=1;i<=n;) {
    111         int first=0,last=0,j;
    112         for(j=i;j<=n&&Faker[j].x==Faker[i].x;++j) 
    113             if(Faker[j].type==1) {
    114                 if(!first) first=j;
    115                 last=j;
    116                 if(j<n&&Faker[i].x==Faker[j+1].x&&Faker[j+1].type==1)
    117                  add(Faker[j].iden,Faker[j+1].iden),o[Faker[j].iden][Faker[j+1].iden]=1;
    118             }
    119         if(last) {
    120             if(first!=last) add(Faker[last].iden,Faker[first].iden);
    121             for(j=i;j<=n&&Faker[j].x==Faker[i].x;++j) 
    122               if(Faker[j].type!=1) 
    123                 add(Faker[last].iden,Faker[j].iden),o[Faker[j].iden][Faker[last].iden]=1;
    124         }
    125         i=j;
    126     }
    127     sort(Faker+1,Faker+1+n,cmp_Y);
    128     for(int i=1;i<=n;) {
    129         int first=0,last=0,j;
    130         for(j=i;j<=n&&Faker[j].y==Faker[i].y;++j) 
    131             if(Faker[j].type==2){
    132                 if(!first) first=j;
    133                 last=j;
    134                 if(j<n&&Faker[i].y==Faker[j+1].y&&Faker[j+1].type==2)
    135                   add(Faker[j].iden,Faker[j+1].iden),o[Faker[j].iden][Faker[j+1].iden]=1;
    136             }
    137         if(last) {
    138             if(first!=last) add(Faker[last].iden,Faker[first].iden);
    139             for(j=i;j<=n&&Faker[j].y==Faker[i].y;++j)
    140               if(Faker[j].type!=2) 
    141                 add(Faker[last].iden,Faker[j].iden),o[Faker[j].iden][Faker[last].iden]=1;
    142         }
    143         i=j;
    144     }
    145      for(int i=1;i<=n;++i) {
    146         if(Faker[i].type==3) {
    147             for(int l=Faker[i].x-1;l<=Faker[i].x+1;++l)
    148               for(int j=Faker[i].y-1;j<=Faker[i].y+1;++j)
    149                 if(m[l][j]&&!(l==Faker[i].x&&j==Faker[i].y)&&!o[l][j]) 
    150                   add(Faker[i].iden,m[l][j]);
    151         }
    152     }
    153     for(int i=1;i<=n;++i)
    154       if(!dfn[i]) tarjan(i);
    155     for(int i=1;i<=n;++i)    
    156           for(int j=head[i];j;j=e[j].next) {
    157               int v=e[j].to;
    158               if(belong[i]!=belong[v])
    159                   readd(belong[i],belong[v]);
    160           }
    161     for(int i=1;i<=id;++i) 
    162       if(!mark[i]) dfs(i);
    163     printf("%d
    ",ans);
    164     return 0;
    165 } 
    166 
    167 int sb=hh();
    168 int main() {;}
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    ASP.NET Web API 控制器执行过程(一)
    ASP.NET Web API 控制器创建过程(二)
    ASP.NET Web API 控制器创建过程(一)
    ASP.NET Web API WebHost宿主环境中管道、路由
    ASP.NET Web API Selfhost宿主环境中管道、路由
    ASP.NET Web API 管道模型
    ASP.NET Web API 路由对象介绍
    ASP.NET Web API 开篇示例介绍
    ASP.NET MVC 视图(五)
    ASP.NET MVC 视图(四)
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7425066.html
Copyright © 2011-2022 走看看