Intergalactic Map SPOJ - IM

传送门

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

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\n",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 }

原文地址:https://www.cnblogs.com/Achenchen/p/9543662.html

时间: 2024-11-10 08:09:35

Intergalactic Map SPOJ - IM的相关文章

SPOJ 962 Intergalactic Map

Intergalactic Map Time Limit: 6000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Original ID: IM64-bit integer IO format: %lld      Java class name: Main Jedi knights, Qui-Gon Jinn and his young apprentice Obi-Wan Kenobi, are entruste

SPOJ 962 Intergalactic Map (网络最大流)

http://www.spoj.com/problems/IM/ 962. Intergalactic Map Problem code: IM Jedi knights, Qui-Gon Jinn and his young apprentice Obi-Wan Kenobi, are entrusted by Queen Padmé Amidala to save Naboofrom an invasion by the Trade Federation. They must leave N

SPOJ IM - Intergalactic Map - [拆点最大流]

题目链接:http://www.spoj.com/problems/IM/en/ Time limit:491 ms Memory limit:1572864 kB Code length Limit:50000 B Jedi knights, Qui-Gon Jinn and his young apprentice Obi-Wan Kenobi, are entrusted by Queen Padmé Amidala to save Naboo from an invasion by th

SPOJ962 Intergalactic Map(最大流)

题目问一张无向图能否从1点走到2点再走到3点,且一个点只走一次. 思维定势思维定势..建图关键在于,源点向2点连边,1点和3点向汇点连边! 另外,题目数据听说有点问题,出现点大于n的数据.. 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1<<30) 7 #de

SPOJ IM_Intergalactic Map

判断能否从一个点同时找出两条不相交的路径到另外两个点. 保证路径不相交,那么需要拆点.然后?好像就没什么了,直接最大流即可. 不过,,,不需要求出所有的最大流,只要跑两次EK看看能否增广两次就行了. 召唤代码君: #include <iostream> #include <cstdio> #include <cstring> #include <map> #define maxn 2001000 #define maxm 5002000 using name

SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解

题意:n*m的方格,"0 x"表示x轴在x位置切一刀,"0 y"表示y轴在y位置切一刀,每次操作后输出当前面积最大矩形. 思路:用set分别储存x轴y轴分割的点,用multiset(可重复)储存x轴y轴边,每次输出最大的长和最大的宽的积.题目可能重复切.multiset如果直接erase(13)会把所有的13都删掉,如果只想删一个则erase(multiset.find(13)).第一次知道set自带二分... 这里multiset也可以用map<int, i

SPOJ 3273

传送门: 这是一道treap的模板题,不要问我为什么一直在写模板题 依旧只放代码 1 //SPOJ 3273 2 //by Cydiater 3 //2016.8.31 4 #include <iostream> 5 #include <cstring> 6 #include <ctime> 7 #include <cmath> 8 #include <cstdlib> 9 #include <string> 10 #include

SPOJ CRAN02 - Roommate Agreement

题目链接:http://www.spoj.com/problems/CRAN02/ 题目大意:N个数字组成的序列,和为0的连续子序列的个数.N<1e6 解题思路:计算前缀和,统计每个数字出现的次数,那么对于数字sum[i], 如果存在k个sum[i],则代表有C(k, 2)个序列和为0,而如果sum[i] = 0,则还要累加上对应的k值. 代码: 1 ll n; 2 int a[maxn]; 3 ll sum[maxn]; 4 map<int, int> mmp; 5 6 void so

SPOJ 1043 Can you answer these queries I 求任意区间最大连续子段和 线段树

题目链接:点击打开链接 维护区间左起连续的最大和,右起连续的和.. #include <cstdio> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <vector> #include <map> using namespace std; #define N 50050 #define Lson