題意:有n個人要去到m個星球上,這n個人每個人對m個星球有乙個選擇,即願不願意去,「y」or"n"。問是否可以全部人都順利到自己想去的星球。
思路:很「有趣」的一道題目,n是1e5的大小,m只有10,沒有想到狀態壓縮,看到n這麼大肯定超時還是強行寫了一波,於是re(tle)。想了挺久還是不會。看別人的思路是說二進位制狀態壓縮。看到這就想到m只有10,於是可以分成1<<10 = 1024種情況,代表有這個選擇,就相當於把人從1e5的大小強行壓到1e3了。然後源點->選擇->星球->匯點這樣的圖就建好了。源點->選擇的邊權是每種選擇的人數,選擇->星球的邊權是對於每種選擇,選擇了這個星球的人數,星球->匯點的邊權是星球容納的人數。就醬了。mark。
1 #include 2 #include 3 #include 4 #include 5 #include6 #include 7 #include 8 #include 9 #include 10 #include
11using
namespace
std;
12#define inf 0x3f3f3f3f
13#define n 1200
14#define num 1024
15 typedef long
long
ll;16
struct
edge
19 edge (int v, int nxt, int
cap) : v(v), nxt(nxt), cap(cap) {}
20 }edge[n*n*2
];21
int tot, head[n], cur[n], pre[n], dis[n], gap[n], s, t, tol[55
];22
23void add(int u, int v, int
cap)
2728
void
bfs() 43}
44}4546
int isap(int
n) 61
//puts("aaaa");
62for(i = cur[u]; ~i; i =edge[i].nxt)
63if(dis[edge[i].v] == dis[u] - 1 && edge[i].cap > 0) break;64
//puts("bbbb");
65if(~i) else77}
78return
ans;79}
8081
intmain()
95 s[ss]++;
96for(int j = 1; j <= m; j++) 99}
100for(int i = 1; i <= m; i++) scanf("
%d", &tol[i]);
101for(int i = 0; i <= 1024; i++)
107}
108}
109for(int i = 1; i <= m; i++) add(num +i, t, tol[i]);
110int ans = isap(t + 1
);111
if(ans == n) puts("
yes"
);112
else puts("no"
);113
114}
115return0;
116 }
HDU 3605 Escape 最大流,狀壓
最大流,n比較大,但是m只有10,所以對應的人的狀態最多有2 m種,因此可以對人進行歸類,那樣n的資料量就只有1024了,求最大流 g 交會超時 要用c include include include include include define maxn 1100 define maxe 2100...
最大流 縮點 HDU 3605 Escape
有n個人,m個星球。每個人都對不同的星球有自己的喜好,每個星球都有自己的容量。問能否讓所有的人都呆在自己喜歡的星球裡。1 n 100000 m 1 m 10 以為是套模板的題,一直tle,mle。看了大佬的 才明白這題需要縮點。因為最多有10個星球,所以最多有 include include inc...
HDU 3605 Escape (最大流 縮點)
題意 給你n個人,m個星球,每個人對這m個星球的都有一定的適應能力,每個星球都有一定的容納量,問能否讓所有的人在星球上生存。剛開始做的時候一直tle 不知道為什麼,改著改著發現建圖的時候,添了很多邊,這樣跑最大流非常慢,看了網上的思路才知道要縮點,因為星球最多才有10個,所以把每個星球適合住的人數存...