poj1716 Integer Intervals(差分约束)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
Integer Intervals
Time Limit: 1000MS | Memory Limit: 10000K |
Description
An integer interval [a,b], a < b, is a set of all consecutive integers beginning with a and ending with b.
Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.
Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.
Input
The
first line of the input contains the number of intervals n, 1 <= n
<= 10000. Each of the following n lines contains two integers a, b
separated by a single space, 0 <= a < b <= 10000. They are the
beginning and the end of an interval.
Output
Output the minimal number of elements in a set containing at least two different integers from each interval.
Sample Input
4 3 6 2 4 0 2 4 7
Sample Output
4
上一题差分约束的阉割版(传送门)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 using namespace std; 8 typedef long long ll; 9 typedef pair<int,int> PII; 10 #define MAXN 50010 11 #define REP(A,X) for(int A=0;A<X;A++) 12 #define INF 0x7fffffff 13 #define CLR(A,X) memset(A,X,sizeof(A)) 14 struct node { 15 int v,d,next; 16 }edge[3*MAXN]; 17 int head[MAXN]; 18 int e=0; 19 void init() 20 { 21 REP(i,MAXN)head[i]=-1; 22 } 23 void add_edge(int u,int v,int d) 24 { 25 edge[e].v=v; 26 edge[e].d=d; 27 edge[e].next=head[u]; 28 head[u]=e; 29 e++; 30 } 31 bool vis[MAXN]; 32 int dis[MAXN]; 33 void spfa(int s){ 34 CLR(vis,0); 35 REP(i,MAXN)dis[i]=i==s?0:INF; 36 queue<int>q; 37 q.push(s); 38 vis[s]=1; 39 while(!q.empty()) 40 { 41 int x=q.front(); 42 q.pop(); 43 int t=head[x]; 44 while(t!=-1) 45 { 46 int y=edge[t].v; 47 int d=edge[t].d; 48 t=edge[t].next; 49 if(dis[y]>dis[x]+d) 50 { 51 dis[y]=dis[x]+d; 52 if(vis[y])continue; 53 vis[y]=1; 54 q.push(y); 55 } 56 } 57 vis[x]=0; 58 } 59 } 60 int main() 61 { 62 ios::sync_with_stdio(false); 63 int n; 64 int u,v,d; 65 int ans=0; 66 int maxn=0; 67 int minn=MAXN; 68 while(scanf("%d",&n)!= EOF&&n) 69 { 70 e=0; 71 init(); 72 REP(i,n) 73 { 74 scanf("%d%d",&u,&v); 75 add_edge(u,v+1,-2); 76 maxn=max(maxn,v+1); 77 minn=min(u,minn); 78 } 79 for(int i=minn;i<maxn;i++){ 80 add_edge(i+1,i,1); 81 add_edge(i,i+1,0); 82 } 83 spfa(minn); 84 cout<<-dis[maxn]<<endl; 85 } 86 return 0; 87 }