• Intergalactic Map SPOJ


    传送门 

    我觉得我写得已经和题解一模一样了,不知道为什么就是过不了。。懒得拍了,反正不是很难,不太想浪费时间。

    1~2~3的一条路径相当于从2~1的一条路径+2~3的一条路径,点不能重复经过,于是拆点。

      1 //Achen
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<cstring>
      5 #include<cstdlib>
      6 #include<vector>
      7 #include<cstdio>
      8 #include<queue>
      9 #include<cmath>
     10 #include<set>
     11 #include<map>
     12 #define Formylove return 0
     13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     15 const int N=71000;
     16 typedef long long LL;
     17 typedef double db;
     18 using namespace std;
     19 int n,m;
     20 
     21 template<typename T>void read(T &x)  {
     22     char ch=getchar(); x=0; T f=1;
     23     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
     24     if(ch=='-') f=-1,ch=getchar();
     25     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
     26 }
     27 
     28 struct edge {
     29     int u,v,cap,fl,nx;
     30     edge(){}
     31     edge(int u,int v,int cap,int fl,int nx):u(u),v(v),cap(cap),fl(fl),nx(nx){} 
     32 }e[N];
     33 
     34 int ecnt=1,fir[N];
     35 void add(int u,int v,int cap) {
     36     e[++ecnt]=edge(u,v,cap,0,fir[u]); fir[u]=ecnt;
     37     //printf("%d->%d:%d
    ",u,v,cap);
     38     e[++ecnt]=edge(v,u,0,0,fir[v]); fir[v]=ecnt;
     39 }
     40 
     41 queue<int>que;
     42 int d[N];
     43 void bfs(int s,int t) {
     44     que.push(t);
     45     For(i,1,n) d[i]=n;
     46     d[t]=0;
     47     while(!que.empty()) {
     48         int x=que.front();
     49         que.pop();
     50         for(int i=fir[x];i;i=e[i].nx) {
     51             int y=e[i].v;
     52             if(d[y]==n&&e[i].cap==0) {
     53                 d[y]=d[x]+1;
     54                 que.push(y); 
     55             }
     56         }
     57     }
     58 }
     59 
     60 #define inf 1e9
     61 int p[N];
     62 int calc(int s,int t) {
     63     int fl=inf;
     64     for(int i=t;i!=s;i=e[p[i]].u)
     65         fl=min(fl,e[p[i]].cap-e[p[i]].fl);
     66     for(int i=t;i!=s;i=e[p[i]].u) 
     67         e[p[i]].fl+=fl,e[p[i]^1].fl-=fl;
     68     return fl;
     69 }
     70 
     71 int c[N],cur[N];
     72 int isap(int s,int t) {
     73     For(i,0,n) c[i]=0;
     74     bfs(s,t);
     75     For(i,1,n) cur[i]=fir[i],c[d[i]]++;
     76     int rs=0;
     77     for(int x=s;d[x]<n;) {
     78         if(x==t) {
     79             rs+=calc(s,t);
     80             x=s;
     81         }
     82         int ok=0;
     83         for(int &i=cur[x];i;i=e[i].nx) if(e[i].cap>e[i].fl&&d[e[i].v]+1==d[x]) {
     84             ok=1; p[x=e[i].v]=i; break;
     85         }
     86         if(!ok) {
     87             int D=n; cur[x]=fir[x];
     88             for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl)
     89                 D=min(D,d[e[i].v]+1);
     90             if(!(--c[d[x]])) break; 
     91             c[d[x]=D]++;
     92             if(x!=s) x=e[p[x]].u;
     93         }
     94     }
     95     return rs;
     96 }
     97 
     98 void init() {
     99     ecnt=1;
    100     memset(fir,0,sizeof(fir));
    101 }
    102 
    103 int main() {
    104 #ifdef ANS
    105     freopen(".in","r",stdin);
    106     freopen(".out","w",stdout);
    107 #endif
    108     int T; read(T);
    109     while(T--) {
    110         init();
    111         read(n); read(m);
    112         int s=2*n+1,t=s+1;
    113         For(i,4,n) add(i,i+n,1);
    114         add(s,n+2,2);
    115         add(1,t,1);
    116         add(3,t,1);
    117         For(i,1,m) {
    118             int x,y;
    119             read(x); read(y);
    120             if(x<1||x>n||y<1||y>n) continue;
    121             add(x+n,y,1);
    122             add(y+n,x,1);
    123         }
    124         n=t;
    125         if(isap(s,t)==2) puts("YES");
    126         else puts("NO");
    127     }
    128     Formylove;
    129 }
    View Code
  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/Achenchen/p/9543662.html
Copyright © 2020-2023  润新知