差分约束 离散化端点之后把端点和相邻端点之间的线段当作新图的顶点
提供一组样例,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 410 using 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; }