2017年2月18日晚解题报告

来源:互联网 发布:mysql timestamp 编辑:程序博客网 时间:2024/05/29 13:57

T1:
分析:
首先看题,发现是一道很简单的欧拉回路题目,O(∩_∩)O,心中窃喜,结果一看数据范围,看不懂的小,纠结了半天,也没想到什么算法让数据最大只有20,只有打了一个欧拉回路.结果居然A了,orz,真是迷啊!
code:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;void setIO(const string&a) {    freopen((a+".in").c_str(),"r",stdin);    freopen((a+".out").c_str(),"w",stdout);}#include<vector>vector<int> G[15];int cnt=0,head,tail;int n,m;bool dfs(int u,int pre) {    int next=0;     for(unsigned i=0;i<G[u].size();i++) {        cnt++;        int v=G[u][i];        if(v==pre) continue;        if(pre) {            if(!next) next=v;            else if(next!=v) return 0;        }else {            if(!next) next=v;            else if(!tail) tail=v;            else return 0;        }    }    if(u==tail) return next==head&&cnt==m*2;    return dfs(next,u);}int main() {    setIO("circuit");    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++) {        int u,v;        scanf("%d%d",&u,&v);        G[u].push_back(v);        G[v].push_back(u);    }    for(int i=1;i<=n;i++) {        if(G[i].size()) {            head=i;            printf("%s\n",dfs(i,0)?"YES":"NO");            return 0;        }    }}

T2:

分析:
刚拿到这题发现是一道MST的模板题,但是看到是一张完全图且n最大是1e5,所以我们肯定不能把所有的边都求出来,那么考虑删边,一开始我以为从他定义的距离考虑,后来发现不行,那么这题可以转化成从(n^2-1)条边中选择(n-1)条边的问题.此时我们可以考虑给x,y,z排序,然后建边,用kruskal求解.
解法的证明:
我们需要满足每辆个点有且仅有一条边,所以我们排序后选择每两个相邻的点之间的距离,因为若中间相隔必然没有相邻优.而对于这样是否能建成一个树也是很显然的.因为相邻两点必然两两不同,所以一定会有树.至于排三次序后出现环的话,可以用并查集解决.

Code:

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int MAXN=300000+10;struct ex{    int x,id;    bool operator < (const ex &a){        return a.x>x;      }}ex[MAXN];struct ey{    int y,id;    bool operator < (const ey &a){        return a.y>y;      }}ey[MAXN];struct ez{    int z,id;    bool operator < (const ez &a){        return a.z>z;      }}ez[MAXN];int n,fa[MAXN];int find(int x){    return fa[x]==x?fa[x]:fa[x]=find(fa[x]);}struct edge{    int from,to,val;    edge(int from=0,int to=0,int val=0):from(from),to(to),val(val){}}e[MAXN*2];bool cmp(const edge &a,const edge& b){    return a.val<b.val;}int len=0;void kruskal(){    long long  ans=0;    fo(i,1,len){        int u=e[i].from,v=e[i].to;        int x=find(u),y=find(v);        if(x==y) continue;        else{            ans+=e[i].val;            fa[x]=y;        }    }    printf("%d",ans);}int main(){    freopen("space.in","r",stdin);    freopen("space.out","w",stdout);    scanf("%d",&n);    fo(i,1,n){        fa[i]=i;        ex[i].id=i;        ey[i].id=i;        ez[i].id=i;        scanf("%d%d%d",&ex[i].x,&ey[i].y,&ez[i].z);    }     sort(ex+1,ex+1+n);    sort(ey+1,ey+1+n);    sort(ez+1,ez+1+n);    fo(i,2,n){        e[++len]=edge(ex[i-1].id,ex[i].id,abs(ex[i].x-ex[i-1].x));          e[++len]=edge(ey[i-1].id,ey[i].id,abs(ey[i].y-ey[i-1].y));        e[++len]=edge(ez[i-1].id,ez[i].id,abs(ez[i].z-ez[i-1].z));      }    sort(e+1,e+1+len,cmp);    kruskal();    return 0;}

T3
还没改完
continue—–

0 0