POJ-3680-Intervals

来源:互联网 发布:华为软件开发流程 编辑:程序博客网 时间:2024/06/01 08:55

参考了下网上别人的博客,因为对这类题型还不太熟

地址:http://blog.csdn.net/waitfor_/article/details/7380406

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int maxm=2000;const int inf=1<<29;struct Edge{    int u;    int v;    int c;}p[maxm];int n,m,k,e,st,des,num[maxm],head[maxm],cost[maxm],pnt[maxm],flow[maxm],nxt[maxm],dist[maxm],pre[maxm];bool vis[maxm];queue<int> q;void AddEdge(int u,int v,int f,int c){    pnt[e]=v;nxt[e]=head[u];cost[e]=c;flow[e]=f;head[u]=e++;    pnt[e]=u;nxt[e]=head[v];cost[e]=-c;flow[e]=0;head[v]=e++;}bool Spfa(){    memset(pre,-1,sizeof(pre));    memset(dist,-1,sizeof(dist));    q.push(st);    dist[st]=0;    while(!q.empty())    {int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=nxt[i]){    int v=pnt[i];    if(flow[i]&&dist[v]<dist[u]+cost[i])    {dist[v]=dist[u]+cost[i];pre[v]=i;if(!vis[v]){    q.push(v);    vis[v]=1;}    }}    }    return dist[des]!=-1;}int maxflow(){    int ans=0;    while(Spfa())    {int mini=inf;for(int i=pre[des];i!=-1;i=pre[pnt[i^1]])    mini=min(mini,flow[i]);for(int i=pre[des];i!=-1;i=pre[pnt[i^1]]){    flow[i]-=mini;    flow[i^1]+=mini;}ans+=mini*dist[des];    }    return ans;}int Search(int val){    int l=1,r=m-1;    while(l<=r)    {int mid=(l+r)>>1;if(num[mid]==val)    return mid;if(num[mid]<val)    l=mid+1;else    r=mid-1;    }    return -1;}int main(){    int T;    scanf("%d",&T);    while(T--)    {e=0;memset(head,-1,sizeof(head));scanf("%d%d",&n,&k);int cnt=1,val[maxm];for(int i=0;i<n;i++){    scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].c);    val[cnt++]=p[i].u;    val[cnt++]=p[i].v;}sort(val+1,val+cnt);m=1;num[m++]=val[1];for(int i=2;i<cnt;i++)    if(val[i]!=val[i-1])num[m++]=val[i];st=0,des=m;for(int i=0;i<m;i++)    AddEdge(i,i+1,k,0);for(int i=0;i<n;i++){    int x=Search(p[i].u);    int y=Search(p[i].v);    AddEdge(x,y,1,p[i].c);}printf("%d\n",maxflow());    }    return 0;}


原创粉丝点击