1 条题解

  • 0
    @ 2025-6-15 20:32:02
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    #define min(x,y) (((x)>(y))?(y):(x))
    #define INF 0x3f3f3f3f
    #define MAX_V 64+16
    using namespace std;
    struct edge
    {
    	int to,cap,cost,rev;
    	edge(){}
    	edge(int to1,int cap1,int cost1,int rev1)
    	{
    		to=to1;
    		cap=cap1;
    		cost=cost1;
    		rev=rev1;
    	}
    };
    int V;
    vector<edge>G[MAX_V];
    int dist[MAX_V];
    int prevv[MAX_V],preve[MAX_V];
    void add_edge(int from,int to,int cap,int cost)
    {
    	G[from].push_back(edge(to,cap,cost,G[to].size()));
    	G[to].push_back(edge(from,0,-cost,G[from].size()-1));
    }
    int min_cost_flow(int s,int t,int f)
    {
    	int res=0,v;
    	while(f>0)
    	{
    		fill(dist,dist+V,INF);
    		dist[s]=0;
    		bool update=true;
    		while(update)
    		{
    			update=false;
    			for(v=0;v<V;v++)
    			{
    				if(dist[v]==INF)
    					continue;
    				for(int i=0;i<G[v].size();i++)
    				{
    					edge &e=G[v][i];
    					if(e.cap>0&&dist[e.to]>dist[v]+e.cost)
    					{
    						dist[e.to]=dist[v]+e.cost;
    						prevv[e.to]=v;
    						preve[e.to]=i;
    						update=true;
    					}
    				}
    			}
    		}
    		if(dist[t]==INF)
    			return -1;
    		int d=f;
    		for(int v=t;v!=s;v=prevv[v])
    			d=min(d,G[prevv[v]][preve[v]].cap);
    		f-=d;
    		res+=d*dist[t];
    		for(v=t;v!=s;v=prevv[v])
    		{
    			edge &e=G[prevv[v]][preve[v]];
    			e.cap-=d;
    			G[v][e.rev].cap+=d;
    		}
    	}
    	return res;
    }
    int main()
    {
    	int i,n,m,id=0;
    	while(~scanf("%d%d",&n,&m))
    	{
    		V=n+2;
    		if(n==0&&m==0)
    			break;
    		add_edge(0,1,2,0);
    		add_edge(n,n+1,2,0);
    		while(m--)
    		{
    			int a,b,c;
    			scanf("%d%d%d",&a,&b,&c);
    			add_edge(a+1,b+1,1,c);
    		}
    		int ans=min_cost_flow(0,n+1,2);
    		printf("Instance #%d: ",++id);
            if(ans==-1)
                printf("Not possible\n");
    		else
    			printf("%d\n",ans);
    		for(i=0;i<=n+1;i++)
    			G[i].clear();
     
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2069
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者