SGU326 Perspective(指派問題)

來源:互聯網
上載者:User

標籤:

題目簡單吧,如果知道題目要幹嘛的話。

每個比賽指定A贏或者B贏使它們贏得次數不超過1贏得次數。建立一個二分圖模型,X部比賽,Y部隊伍,用最大流求解,如果最後最大流等於比賽場數就有解。

然而我還是掉坑裡了。。。我多算了1在同一賽區贏的次數。。

  1 #include<cstdio>  2 #include<cstring>  3 #include<queue>  4 #include<algorithm>  5 using namespace std;  6 #define INF (1<<30)  7 #define MAXN 222   8 #define MAXM 1400   9  10 struct Edge{ 11     int v,cap,flow,next; 12 }edge[MAXM]; 13 int vs,vt,NE,NV; 14 int head[MAXN]; 15  16 void addEdge(int u,int v,int cap){ 17     edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=0; 18     edge[NE].next=head[u]; head[u]=NE++; 19     edge[NE].v=u; edge[NE].cap=0; edge[NE].flow=0; 20     edge[NE].next=head[v]; head[v]=NE++; 21 } 22  23 int level[MAXN]; 24 int gap[MAXN]; 25 void bfs(){ 26     memset(level,-1,sizeof(level)); 27     memset(gap,0,sizeof(gap)); 28     level[vt]=0; 29     gap[level[vt]]++; 30     queue<int> que; 31     que.push(vt); 32     while(!que.empty()){ 33         int u=que.front(); que.pop(); 34         for(int i=head[u]; i!=-1; i=edge[i].next){ 35             int v=edge[i].v; 36             if(level[v]!=-1) continue; 37             level[v]=level[u]+1; 38             gap[level[v]]++; 39             que.push(v); 40         } 41     } 42 } 43  44 int pre[MAXN]; 45 int cur[MAXN]; 46 int ISAP(){ 47     bfs(); 48     memset(pre,-1,sizeof(pre)); 49     memcpy(cur,head,sizeof(head)); 50     int u=pre[vs]=vs,flow=0,aug=INF; 51     gap[0]=NV; 52     while(level[vs]<NV){ 53         bool flag=false; 54         for(int &i=cur[u]; i!=-1; i=edge[i].next){ 55             int v=edge[i].v; 56             if(edge[i].cap!=edge[i].flow && level[u]==level[v]+1){ 57                 flag=true; 58                 pre[v]=u; 59                 u=v; 60                 //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap)); 61                 aug=min(aug,edge[i].cap-edge[i].flow); 62                 if(v==vt){ 63                     flow+=aug; 64                     for(u=pre[v]; v!=vs; v=u,u=pre[u]){ 65                         edge[cur[u]].flow+=aug; 66                         edge[cur[u]^1].flow-=aug; 67                     } 68                     //aug=-1; 69                     aug=INF; 70                 } 71                 break; 72             } 73         } 74         if(flag) continue; 75         int minlevel=NV; 76         for(int i=head[u]; i!=-1; i=edge[i].next){ 77             int v=edge[i].v; 78             if(edge[i].cap!=edge[i].flow && level[v]<minlevel){ 79                 minlevel=level[v]; 80                 cur[u]=i; 81             } 82         } 83         if(--gap[level[u]]==0) break; 84         level[u]=minlevel+1; 85         gap[level[u]]++; 86         u=pre[u]; 87     } 88     return flow; 89 } 90  91 int map[22][22]; 92 int init[22]; 93 int main(){ 94     int n,a; 95     scanf("%d",&n); 96     for(int i=1; i<=n; ++i) scanf("%d",init+i); 97     scanf("%d",&a); 98     init[1]+=a; 99     for(int i=2; i<=n; ++i) scanf("%*d");100     for(int i=1; i<=n; ++i){101         for(int j=1; j<=n; ++j) scanf("%d",&map[i][j]);102     }103     for(int i=2; i<=n; ++i){104         if(init[i]>init[1]){105             puts("NO");106             return 0;107         }108     }109 110     int cnt=0;111     for(int i=2; i<=n; ++i){112         for(int j=i+1; j<=n; ++j){113             if(map[i][j]) ++cnt;114         }115     }116 117     vs=0; vt=cnt+n+1; NV=vt+1; NE=0;118     memset(head,-1,sizeof(head));119     int tmp=0,tot=0;120     for(int i=2; i<=n; ++i){121         for(int j=i+1; j<=n; ++j){122             if(map[i][j]){123                 tot+=map[i][j];124 125                 ++tmp;126                 addEdge(vs,tmp,map[i][j]);127                 addEdge(tmp,i+cnt,map[i][j]);128                 addEdge(tmp,j+cnt,map[i][j]);129             }130         }131     }132     for(int i=2; i<=n; ++i) addEdge(i+cnt,vt,init[1]-init[i]);133     if(ISAP()==tot) puts("YES");134     else puts("NO");135     return 0;136 }

 

SGU326 Perspective(指派問題)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.