spoj segment

来源:互联网 发布:基于python的paas 编辑:程序博客网 时间:2024/06/11 21:28

差分约束  离散化端点之后把端点和相邻端点之间的线段当作新图的顶点

提供一组样例,wa的估计都wa这了

input

5
1 2 1
1 3 0
2 4 0
3 5 0
4 5 0

output

1

#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define N 410using namespace std;int num[N*4];int tim[N*4],dis[N*4];bool vis[N*4];int head[N*4],cnt,nn,nnn;struct Edge{    int v,w,next;}edge[N*7];void init(){    memset(head,-1,sizeof(head));    cnt=0;}void addedge(int u,int v,int w){    edge[cnt].v=v;    edge[cnt].w=w;    edge[cnt].next=head[u];    head[u]=cnt++;}bool spfa(){    int i;    queue<int>q;    for(i=1;i<nnn;i++)dis[i]=80000000;    dis[0]=0;    memset(vis,0,sizeof(vis));    memset(tim,0,sizeof(tim));    q.push(0);    vis[0]=1,tim[0]=1;    while(!q.empty()){        int u=q.front();        q.pop();        vis[u]=0;        if(tim[u]>=nnn)return 0;        for(int i=head[u];i!=-1;i=edge[i].next){            int v=edge[i].v;            if(dis[v]>dis[u]+edge[i].w){                dis[v]=dis[u]+edge[i].w;                if(vis[v]==0){                    vis[v]=1;                    tim[v]++;                    q.push(v);                }            }        }    }    return 1;}int main(){    int i,a[N],b[N],c[N],k,n;    //freopen("a.txt","r",stdin);    //freopen("b1.txt","w",stdout);    scanf("%d",&n);{        k=0;        for(i=1;i<=n;i++){            scanf("%d %d %d",&a[i],&b[i],&c[i]);            //num[k++]=(ll)a[i]*2;            //num[k++]=(ll)b[i]*2-1;            num[k++]=a[i];            num[k++]=b[i];        }        sort(num,num+k);        nn=unique(num,num+k)-num;        nnn=nn*2;        for(i=1;i<=n;i++){            //a[i]=lower_bound(num,num+nn,(ll)a[i]*2)-num;            //b[i]=lower_bound(num,num+nn,(ll)b[i]*2-1)-num;            a[i]=(lower_bound(num,num+nn,a[i])-num)*2;            b[i]=(lower_bound(num,num+nn,b[i])-num)*2-1;        }        int l=1,h=n,ans=1000;        while(l<=h){            int mid=(l+h)>>1;            init();            for(i=1;i<=n;i++){                addedge(a[i],b[i],mid);                addedge(b[i],a[i],-1);            }            for(i=1;i<nnn;i++)                addedge(i,i-1,0);            if(spfa()){                h=mid-1;                ans=min(mid,ans);            }            else                l=mid+1;        }        printf("%d\n",ans);    }    return 0;}



原创粉丝点击