日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bzoj4427【Nwerc2015】Cleaning Pipes清理管道

發(fā)布時(shí)間:2024/10/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj4427【Nwerc2015】Cleaning Pipes清理管道 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

Link?ping有一個(gè)相當(dāng)復(fù)雜的水資源運(yùn)輸系統(tǒng)。在Link?ping周圍的出水點(diǎn)有一些水井。這些水通過(guò)管道輸送到其它地點(diǎn)。每條管道是從某一個(gè)水井到城市的某個(gè)位置的直線管道。 所有管道在地下的深度相同。因此,無(wú)論何時(shí),兩個(gè)管道相交時(shí),它們會(huì)形成交點(diǎn)。幸運(yùn)的是,管道系統(tǒng)正好是以滿足兩個(gè)管道有交點(diǎn)的方式建造。井不計(jì)入交點(diǎn)。任何數(shù)量的管道(包括零個(gè)與超過(guò)兩個(gè))都可以來(lái)源于每一個(gè)水井。 這些交點(diǎn)導(dǎo)致了一個(gè)問(wèn)題,因?yàn)槲酃?#xff08;石灰和其它東西的混合物)往往會(huì)卡住交點(diǎn),導(dǎo)致管道崩潰和坍塌,導(dǎo)致大型水槽孔的形成。這樣的水槽孔對(duì)Link?ping的學(xué)生有吸引的效果,使他們荒廢學(xué)業(yè),不受教育,這從長(zhǎng)遠(yuǎn)來(lái)看將不只是導(dǎo)致管道系統(tǒng)的崩潰,還有社會(huì)的結(jié)構(gòu)。因此,當(dāng)務(wù)之急是管道定期清理。北歐提水再分配公司(NWERC) -負(fù)責(zé)Link?ping的水管的 – 擁有充足的機(jī)器人車隊(duì)才可以完成此任務(wù)。一個(gè)機(jī)器人可以在一條管道的開(kāi)始位置被插入。然后,機(jī)器人通過(guò)管道一直到結(jié)束,并清除沿途所有交點(diǎn)。到達(dá)終點(diǎn)后,機(jī)器人轉(zhuǎn)身并返回它開(kāi)始的井。為了防止機(jī)器人互相碰撞,政府法規(guī)規(guī)定每當(dāng)兩個(gè)管相交,它們中的至多一個(gè)可以包含一個(gè)機(jī)器人。 由于整個(gè)水系統(tǒng)在被清潔時(shí)必須關(guān)閉(另一政府法規(guī)),則NWERC想迅速完成清洗,使用一批次清潔機(jī)器人,都必須在同一時(shí)間開(kāi)始。 你的任務(wù)是驗(yàn)證是否可以做到這一點(diǎn) - 即,是否能夠把機(jī)器人同時(shí)插入管道中的一些,在不會(huì)有兩個(gè)機(jī)器人相撞的危險(xiǎn)下清潔所有交點(diǎn)。

輸入格式

輸入包括: 第一行兩個(gè)整數(shù)w(1<=w<=1000)和p(1<=p<=1000),分別表示井的數(shù)量和管道的數(shù)量。 接下來(lái)w行,每行兩個(gè)整數(shù)xi和yi(-10000<=x,y<=10000),表示i號(hào)井的位置(井從1到w編號(hào))。 接下來(lái)p行,每行3個(gè)整數(shù)s(1<=s<=w)表示管道從s號(hào)井開(kāi)始,x和y(-10000<=x,y<=10000)表示管道在位置為x,y的點(diǎn)結(jié)束。 每條管道都有一個(gè)井,就是它開(kāi)始的那個(gè)。被兩個(gè)或多個(gè)管道共享的點(diǎn)是一口井。任兩條管道至多會(huì)有一個(gè)交點(diǎn)。兩條管道的公共點(diǎn)可以是他們其中之一或兩者的端點(diǎn)。所有管道的長(zhǎng)度為正數(shù)。

輸出格式

If it is possible to clean all intersections as described above, output “possible”. Otherwise, output “impossible”. 如果在上述情況下可以清理所有交點(diǎn),輸出“possible”,否則輸出“impossible”。
  • 題解:

    • 題目意思一些射線,端點(diǎn)不算交點(diǎn),相交的射線只能放一個(gè)機(jī)器人,問(wèn)是否有方案讓每一個(gè)交點(diǎn)都被機(jī)器人經(jīng)過(guò);
    • 如果A和B有交點(diǎn),那么A放B不放,A不放B一定放,(多個(gè)交于一點(diǎn)也是符合題意的),轉(zhuǎn)化成2-sat求解;
    • 翻閱了官解,發(fā)現(xiàn)如果有交點(diǎn)A和B連邊,二分圖判定(因?yàn)楹戏ǖ姆桨笇?duì)應(yīng)了二分圖的某一邊的點(diǎn)集);
    • 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=1010; 5 int n,m,tot,id[N][2],o=1,hd[N<<1],dfn[N<<1],low[N<<1],idx,st[N<<1],top,bl[N<<1],del[N<<1],cnt; 6 struct Edge{int v,nt;}E[N*N*2]; 7 struct point{ 8 int x,y; 9 point(int _x=0,int _y=0):x(_x),y(_y){}; 10 point operator +(const point&A)const{return point(x+A.x,y+A.y);} 11 point operator -(const point&A)const{return point(x-A.x,y-A.y);} 12 bool operator ==(const point&A)const{return x==A.x&&y==A.y;} 13 int operator *(const point&A)const{return x*A.x+y*A.y;} 14 int operator ^(const point&A)const{return x*A.y-y*A.x;} 15 }p[N]; 16 struct line{point a,b;}l[N]; 17 void Adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;} 18 void tarjan(int u){ 19 dfn[st[++top]=u]=low[u]=++idx; 20 for(int i=hd[u];i;i=E[i].nt){ 21 int v=E[i].v; 22 if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]); 23 else if(!del[v])low[u]=min(low[u],dfn[v]); 24 } 25 if(dfn[u]==low[u]){ 26 int v;cnt++; 27 do{ 28 bl[v=st[top--]]=cnt; 29 del[v]=1; 30 }while(v!=u); 31 } 32 } 33 bool judge(int i,int j){ 34 if(l[i].a==l[j].a)return false; 35 point a=l[j].a-l[i].a,b=l[j].b-l[i].a,c=l[i].b-l[i].a; 36 if((ll)(c^a)*(c^b)>0)return false; 37 b=l[j].a-l[i].b,c=l[j].b-l[j].a; 38 if((ll)(c^a)*(c^b)>0)return false; 39 return true; 40 } 41 int main(){ 42 #ifndef ONLINE_JUDGE 43 freopen("bzoj4427.in","r",stdin); 44 freopen("bzoj4427.out","w",stdout); 45 #endif 46 scanf("%d%d",&n,&m); 47 for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y); 48 for(int i=1,x;i<=m;i++){ 49 scanf("%d",&x);l[i].a=p[x]; 50 scanf("%d%d",&l[i].b.x,&l[i].b.y); 51 id[i][0]=++tot;id[i][1]=++tot; 52 } 53 for(int i=1;i<=m;i++) 54 for(int j=i+1;j<=m;j++)if(i!=j&&judge(i,j)){ 55 Adde(id[i][0],id[j][1]); 56 Adde(id[i][1],id[j][0]); 57 Adde(id[j][0],id[i][1]); 58 Adde(id[j][1],id[i][0]); 59 } 60 for(int i=1;i<=tot;i++)if(!dfn[i])tarjan(i); 61 int fg=0;for(int i=1;i<=m;i++)if(bl[id[i][0]]==bl[id[i][1]]){fg=1;break;} 62 puts(fg?"impossible":"possible"); 63 return 0; 64 } bzoj4427

      ?

轉(zhuǎn)載于:https://www.cnblogs.com/Paul-Guderian/p/10269213.html

總結(jié)

以上是生活随笔為你收集整理的bzoj4427【Nwerc2015】Cleaning Pipes清理管道的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。