CodeForces 160D Edges in MST ( kruskal+求割边 )

kruskal+求割边

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector> 
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
using namespace std;

const int N=200010;
const int INF=((1<<31)-1);
int ans[N],q[N];
struct cutting_edge{
    int cnt,scnt;
    int dfn[N],low[N],vis[N];
    vector< pair<int,int> > G[N];
    void init(int n){
        for(int i=0;i<=n;i++){
            G[i].clear();
            vis[i]=0;
        }
    }
    void add(int u,int v,int id){
        G[u].push_back(make_pair(v,id));
        G[v].push_back(make_pair(u,id));
    }
    void dfs(int u,int father){
        dfn[u]=low[u]=++cnt;
        vis[u]=1;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].first;
            int id=G[u][i].second;
            if(vis[v]&&id!=father)
                low[u]=min(dfn[v],low[u]);
            else if(!vis[v]) {  
                dfs(v,id);
                low[u]=min(low[u],low[v]); 
                if(dfn[u]<low[v]) {
                    scnt++; ans[id]=1;
                }
            }
        }
    }
    int tarjan(int *q,int tail){
        cnt=0; scnt=0;
        for(int i=0;i<tail;i++) 
            if(!vis[ q[i] ]) dfs( q[i],-1 );
        return scnt;
    }
}ce;

struct node{
    int u,v,w,id;
}e[N];
struct ufind{
    int f[N];
    void init(int x) { for(int i=0;i<=x;i++) f[i]=i;}
    int find(int x) { return f[x]==x?x:f[x]=find(f[x]);}
    void set_friend(int i,int j){ f[find(i)]=find(j);}
    bool is_friend(int i,int j){
        return find(i)==find(j) ? 1:0;
    }
}uf;
bool cmp(node a,node b){
    return a.w<b.w;
}
void kruskal(int n,int m){
    sort(e,e+m,cmp);
    uf.init(n);
    int pre=0;
    for(int i=0;i<=m;i++){
        if(e[pre].w!=e[i].w){
            int tail=0;
            for(int j=pre;j!=i;j++){
                if(!uf.is_friend(e[j].u,e[j].v)){
                    ce.G[ uf.find(e[j].u) ].clear(); 
                    ce.G[ uf.find(e[j].v) ].clear();
                    ce.vis[ uf.find(e[j].u) ]=0;
                    ce.vis[ uf.find(e[j].v) ]=0;
                    q[tail++]=uf.find(e[j].u);
                    q[tail++]=uf.find(e[j].v);
                    ans[e[j].id]=2; 
                }
            }
            for(int j=pre;j!=i;j++){
                if(!uf.is_friend(e[j].u,e[j].v)){
                    ce.add(uf.find(e[j].u),uf.find(e[j].v),e[j].id);
                }
            }
            ce.tarjan(q,tail);
            for(int j=pre;j!=i;j++){
                if(!uf.is_friend(e[j].u,e[j].v)){
                    uf.set_friend(e[j].u,e[j].v);
                }
            }
            pre=i;
        }
    }
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    e[m].w=INF;
    for(int i=0;i<m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        e[i].u=u; e[i].v=v; e[i].w=w; e[i].id=i;
        ans[i]=0;
    }
    kruskal(n,m);
    for(int i=0;i<m;i++){
        if(ans[i]==0) printf("none\n");
        else if(ans[i]==1) printf("any\n");
        else printf("at least one\n");
    }
}
posted @ 2012-05-03 19:27  HaoHua_Lee  阅读(239)  评论(0编辑  收藏  举报