查并集

 

1P1111 修复公路

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout); 
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";


const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;) 
#define CLR(arr,val) memset(arr,val,sizeof(arr)) 
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)


#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll; 
typedef double dl; 

struct node
{
    int u,v,w;
}e[sz];
bool cmp(node l,node r)
{
    return l.w<r.w;
}
int fa[sz],n,m;
int getf(int u )
{
    if(fa[u]!= u ) fa[u]=getf(fa[u]);
    return fa[u];

}
bool uni(int u,int v)
{
    int fu = getf(u);
    int fv = getf(v);
    if(fu!=fv)
    {
        fa[fu]=fv;
        return true;
    }
    return false;
}


int main()
{
    LOACL
    FASTIO
    cin>>n>>m;
    REP(i,1,m)cin>>e[i].u>>e[i].v>>e[i].w;
    REP(i,1,n) fa[i]=i;
    sort(e+1,e+m+1,cmp);
  
     
     REP(i,1,m)
     {
         if(fa[e[i].u] !=fa[e[i].v])
         {
             if(uni(e[i].u,e[i].v)) n--;
         }
      
         if(n==1)
         {
             cout<<e[i].w<<endl;
             return 0; 
         }
  
     }
    cout<<-1<<endl;

 
    CLOCK
    return 0;
}
View Code
说一下,计算时间问题,有人说是不一样快的,但是递归的压栈时间是相同的,所以速度是一样的.  
 

2P2024 食物链

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout); 
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";


const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;) 
#define CLR(arr,val) memset(arr,val,sizeof(arr)) 
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)


#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll; 
typedef double dl; 
int n,m,z,x,y,ans;
int fa[sz];
int getf(int u)
{
    if(fa[u]!=u)
        fa[u]=getf(fa[u]);
    return fa[u];
} 

void uni(int u,int v)
{
    int fu = getf(u);
    int fv = getf(v);
    if(fu!=fv)
    {
        fa[fu]=fv;
    }
}
int main()
{
    LOACL
    FASTIO
    cin>>n>>m;
    REP(i,0,3*n)fa[i]=i;
    
    REP(i,1,m)
    {
        cin>>z>>x>>y;
        if(x>n||y>n){ ans++;continue;}
        if(z==1)
        {
            if(getf(x+n)==getf(y)||getf(x+2*n)==getf(y))
            {
                ans++;continue;
            }
            uni(x,y),uni(x+n,y+n),uni(x+2*n,y+2*n); 
        }
        else if(z==2)
        {
             
            if(x==y) {ans++; continue;}  
           
            if(getf(x)==getf(y)||getf(x+2*n)==getf(y)||getf(x)==getf(y))
            {
                ans++; continue;    
            }
            uni(x,y+2*n); uni(x+n,y); uni(x+2*n,y+n);
        }
        else 
        {
            ans++;continue;
        }
    }
    #if 0 
    #endif
    cout<<ans<<endl;
    CLOCK
    return 0;
}
View Code

维护一下 三方 因为要么就是 互相吃,要么就是同类

 

3P1197 [JSOI2008]星球大战

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout); 
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";


const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;) 
#define CLR(arr,val) memset(arr,val,sizeof(arr)) 
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)


#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll; 
typedef double dl; 
int n,m,k,tot,ans[400001],bro[400001],fa[400001],head[400001];
bool bor[400001];
 
struct edge
{
    int v,nxt,u;
}e[400001];
void add(int u,int v)
{
    e[++tot]=(edge){v,head[u],u},head[u]=tot; 
}
int getf(int u)
{
    if(u!=fa[u])
        fa[u]= getf(fa[u]);
    return fa[u];    
}
void uni(int u,int v)
{
    int fu = getf(u);
    int fv = getf(v);
    if(fu!=fv)
        fa[fu]=fv;
}
int main()
{
    LOACL
    FASTIO

      cin>>n>>m;
    REP(i,1,n)fa[i]=i,head[i]=-1;
    REP(i,1,m)
    {
        int x,y;
         
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    cin>>k;
    REP(i,1,k)
    {
        cin>>bro[i];
        bor[bro[i]]=1;
    }

    int total = n-k;
    REP(i,1,2*m)
    {
        if(!bor[e[i].u] && !bor[e[i].v] && getf(e[i].u)!=getf(e[i].v))
        {
            total--;
            uni(e[i].u,e[i].v);
        }
    }
    ans[k+1]=total;
    DOWN(i,k,1)
    {
        total++;
        bor[bro[i]]=0;
        for(int j = head[bro[i]];j!=-1;j=e[j].nxt)
        {
            if(!bor[e[j].v] && getf(e[j].u)!=getf(e[j].v))
            {
                total -- ;
                uni(bro[i],e[j].v);
            }
        }
        ans[i]=total;
    }
      REP(i,1,k+1)    cout<<ans[i]<<endl;
    
    return 0;
}
View Code

已经 进行处理 了,全部砸了,逆向建立道路 ,但是 就是TLE 生气

不知道 为什么 还是TLE

 

转载于:https://www.cnblogs.com/corx/p/8727449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值