zoukankan      html  css  js  c++  java
  • light oj 1153

    1153 - Internet Bandwidth
    Time Limit: 2 second(s) Memory Limit: 32 MB

    On the Internet, machines (nodes) are richly interconnected, and many paths may exist between a given pair of nodes. The total message-carrying capacity (bandwidth) between two given nodes is the maximal amount of data per unit time that can be transmitted from one node to the other. Using a technique called packet switching; this data can be transmitted along several paths at the same time.

    For example, the following figure shows a network with four nodes (shown as circles), with a total of five connections among them. Every connection is labeled with a bandwidth that represents its data-carrying capacity per unit time.

     

    In our example, the bandwidth between node 1 and node 4 is 25, which might be thought of as the sum of the bandwidths 10 along the path 1-2-4, 10 along the path 1-3-4, and 5 along the path 1-2-3-4. No other combination of paths between nodes 1 and 4 provides a larger bandwidth.

    You must write a program that computes the bandwidth between two given nodes in a network, given the individual bandwidths of all the connections in the network. In this problem, assume that the bandwidth of a connection is always the same in both directions (which is not necessarily true in the real world).

    Input

    Input starts with an integer T (≤ 30), denoting the number of test cases.

    Every description starts with a line containing an integer n (2 ≤ n ≤ 100), which is the number of nodes in the network. The nodes are numbered from 1 to n. The next line contains three numbers st, and c. The numbers s and t are the source and destination nodes, and the number c (c ≤ 5000, s ≠ t) is the total number of connections in the network. Following this are c lines describing the connections. Each of these lines contains three integers: the first two are the numbers of the connected nodes, and the third number is the bandwidth of the connection. The bandwidth is a non-negative number not greater than 1000.

    There might be more than one connection between a pair of nodes, but a node cannot be connected to itself. All connections are bi-directional, i.e. data can be transmitted in both directions along a connection, but the sum of the amount of data transmitted in both directions must be less than the bandwidth.

    Output

    For each case of input, print the case number and the total bandwidth between the source node s and the destination node t.

    Sample Input

    Output for Sample Input

    2

    4

    1 4 5

    1 2 20

    1 3 10

    2 3 5

    2 4 10

    3 4 20

    4

    1 4 2

    1 4 20

    1 4 20

    Case 1: 25

    Case 2: 40

    注意:此题是无向图的网络流,在处理反向边的时候,不能把反向边的容量设置为0 而要设置的和正向边一样

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<math.h>
    #include<algorithm>
    #define MAX 10010
    #define INF 0x7ffff
    #define MAXM 100100
    using namespace std;
    struct node
    {
    	int from,to,cap,flow,next;
    }edge[MAXM];
    int dis[MAX],vis[MAX];
    int cur[MAX];
    int ans,head[MAX];
    void init()
    {
    	ans=0;
    	memset(head,-1,sizeof(head));
    }
    void add(int u,int v,int w)
    {
    	edge[ans]={u,v,w,0,head[u]};
    	head[u]=ans++;
    	edge[ans]={v,u,w,0,head[v]};//这是有向图  无向图 	edge[ans]={v,u,0,0,head[v]};
    	head[v]=ans++;
    }
    int start,hui,sum;
    void getmap()
    {
    	scanf("%d%d%d",&start,&hui,&sum);
    	for(int i=1;i<=sum;i++)
    	{
    		int a,b,c;
    		scanf("%d%d%d",&a,&b,&c);
    		add(a,b,c);
    	}
    }
    int bfs(int beg,int end)
    {
    	queue<int>q;
    	memset(vis,0,sizeof(vis));
    	memset(dis,-1,sizeof(dis));
    	while(!q.empty()) q.pop();
    	vis[beg]=1;
    	dis[beg]=0;
    	q.push(beg);
    	while(!q.empty())
    	{
    		int u=q.front();
    		q.pop();
    		for(int i=head[u];i!=-1;i=edge[i].next)
    		{
    			node E=edge[i];
    			if(!vis[E.to]&&E.cap>E.flow)
    			{
    				dis[E.to]=dis[u]+1;
    				vis[E.to]=1;
    				if(E.to==end) return 1;
    				q.push(E.to);
    			}
    		}
    	}
    	
    	return 0;
    }
    int dfs(int x,int a,int end)
    {
    	if(x==end||a==0)
    	return a;
    	int flow=0,f;
    	for(int& i=cur[x];i!=-1;i=edge[i].next)
    	{
    		node& E=edge[i];
    		if(dis[E.to]==dis[x]+1&&(f=dfs(E.to,min(a,E.cap-E.flow),end))>0)
    		{
    			E.flow+=f;
    			edge[i^1].flow-=f;
    			flow+=f;
    			a-=f;
    			if(a==0) break;
    		}
    	}
    	return flow;
    }
    int maxflow(int beg,int end)
    {
    	int flow=0;
    	while(bfs(beg,end))
    	{
    		memcpy(cur,head,sizeof(head));
    		flow+=dfs(beg,INF,end);
    	}
    	return flow;
    }
    int main()
    {
    	int t,k,n,m;
    	scanf("%d",&t);
    	k=1;
    	while(t--)
    	{
    		scanf("%d",&n);
    		init();
    		getmap();
    		printf("Case %d: %d
    ",k++,maxflow(start,hui));
    	} 
    	return 0;
    }
    

      

  • 相关阅读:
    直方图
    Netty学习摘记 —— 初步认识Netty核心组件
    打败算法 —— 圆圈中最后剩下的数字
    打败算法 —— 单词的压缩编码
    大数据生态圈 —— 关于实时流处理的单节点伪分布式环境搭建
    打败算法 —— 按摩师
    打败算法 —— 最长公共子序列
    Spark学习摘记 —— Pair RDD行动操作API归纳
    Spark学习摘记 —— Pair RDD转化操作API归纳
    Spark学习摘记 —— RDD行动操作API归纳
  • 原文地址:https://www.cnblogs.com/tonghao/p/4954335.html
Copyright © 2011-2022 走看看