HDU 5302 Connect the Graph (构造)

来源:互联网 发布:淘宝发货后找不到店铺 编辑:程序博客网 时间:2024/06/09 22:04

原题解链接:http://www.cnblogs.com/shjwudp/p/4719279.html

[code]:

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;typedef pair<int,int> P;int w[3],b[3],n;vector<P> G[2];void init(){    G[0].clear();    G[1].clear();}void sol1(){    int i,j;        w[1] -= 2;        G[0].push_back(P(1,2));        for(i = 2;i <= w[2]+1;i++) G[0].push_back(P(i,i+1));        for(i++;w[1]&&i <= n;i+=2,w[1]-=2) G[0].push_back(P(i,i+1));}void sol2(){    int i,j,mid = (n+1)/2;    int cur = 1;        G[1].push_back(P(1,mid+1));        cur = mid+1;        for(i = 0;i < b[2];i++){            if(cur > mid){                G[1].push_back(P(cur,cur-mid+1));                cur = cur-mid+1;            }else{                G[1].push_back(P(cur,cur+mid));                cur = cur+mid;            }        }        b[1] -= 2;        cur = cur>mid?cur-mid+1:cur+mid;        for(i = 0;i < b[1];i+=2){            if(cur > mid){                G[1].push_back(P(cur,cur-mid+1));            }else{                G[1].push_back(P(cur,cur+mid));            }            cur++;        }}int main(){    int i,j,cas;    scanf("%d",&cas);    while(cas--){        init();        for(i = 0;i < 3;i++) scanf("%d",&w[i]);        for(i = 0;i < 3;i++) scanf("%d",&b[i]);        if(w[1]%2==1||b[1]%2==1){            puts("-1");            continue;        }        n = w[0]+w[1]+w[2];        if(n == 4){            printf("4\n1 2 0\n1 3 0\n2 4 1\n3 4 1\n");            continue;        }        sol1();        sol2();        printf("%d\n",G[0].size()+G[1].size());        for(i = 0;i < G[0].size();i++){            printf("%d %d 0\n",G[0][i].first,G[0][i].second);        }        for(i = 0;i < G[1].size();i++){            printf("%d %d 1\n",G[1][i].first,G[1][i].second);        }    }    return 0;}

0 0
原创粉丝点击