Frequency Hopping

Time Limit: 10000ms
Memory Limit: 131072KB

This problem will be judged on UVA. Original ID: 11248
64-bit integer IO format: %lld      Java class name: Main

20th July, 1942

Colonel Al Pacheno,According to the previous order “ref:    232/UK44i/334sda#nh$X3y”, you are required back in the DOI (Department of intelligence, London) to head the special programming contingent immediately. You are to assign a programmer for the job whose specification is attached with this letter. Level 3 Secrecy must be maintained. 

Sincerely,
General Shaan Konary
Director, DOI
London
Ps: Sorry to ruin your Caribbean holiday

232/UK44i/334sda#nh$X3y/Appx-301a
At this moment, through out Europe, our base station numbers 1 to N are actively operational
through wireless channels. Immediately we require sending C secret message fragments from
our head quarters (base station 1) to Nth base station. Germans have developed Zämmhäim – a
machine which jams the frequency channel between base stations after a station has sent a
message fragment. In that case, the base stations must transmit using a different frequency
channel for each message fragment. There are several unidirectional channels set up between
base stations at this moment. We can only make arrangements to set up number of frequency
channels only between two base stations. Your task is to check whether all the message
fragments can be sent to the desired base station with or without increasing frequency channel
between any two particular base stations. You have to give us all possible options if it is
required to increase frequency channel between two stations.
--End of Attachment

As members of Secret Programmers Group (SPG) you are assigned to solve this problem within 5 hrs
and deliver the solution directly to Colonel Al Pacheno. You have to maintain Level 3 secrecy and
destroy all documents corresponding to this as soon as you deliver the solution.

Input:
There will be multiple test cases. The first line of each test case contains three numbers N, E and C
where N (0<N<101) represents the number of base stations, E (E<10000) represents the number of
available connections between the base stations and C (C<2000000000) represents the number of
secret message fragments that are required to send from station 1 to station N. After that, there will be
E lines. Each line contains 3 numbers: b1(0<b1<101), b2(0<b2<101) and fp (0<fp<5001) which
represent the number of frequency channels available currently from b1 to b2. Input is terminated when
N=E=C=0. 1
Output:
For each test case, there will be one line of output. First, you have to print the case number. If it is
possible to send C secret message fragments from the current status the output will be “possible”.
Otherwise, you have to print all pairs of stations (in ascending order) if it is possible send the required
message fragments by increasing the frequency channel between any one of them. If it is still
impossible, you have to print “not possible”.

Sample Input Output for Sample Input
4 4 5
1 2 5
1 3 5
2 4 5
3 4 5
4 4 5
1 2 1
1 3 5
2 4 5
3 4 1
4 4 5
1 2 1
1 3 1
2 4 1
3 4 1
0 0 0

Case 1: possible
Case 2: possible option:(1,2),(3,4)
Case 3: not possible

Problemsetter: Syed Monowar Hossain
Special Thanks: Abdullah al Mahmud

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
struct arc {
int to,flow,next;
arc(int x = ,int y = ,int z = -) {
to = x;
flow = y;
next = z;
}
};
arc e[maxn*];
int head[maxn],d[maxn],cur[maxn];
int tot,S,T,N,E,C,cnt;
void add(int u,int v,int flow) {
e[tot] = arc(v,flow,head[u]);
head[u] = tot++;
e[tot] = arc(u,,head[v]);
head[v] = tot++;
}
bool bfs() {
memset(d,-,sizeof(d));
queue<int>q;
d[S] = ;
q.push(S);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = head[u]; ~i; i = e[i].next) {
if(e[i].flow > && d[e[i].to] == -) {
d[e[i].to] = d[u] + ;
q.push(e[i].to);
}
}
}
return d[T] > -;
}
pii rec[maxn*];
int dfs(int u,int low) {
if(u == T) return low;
int tmp = ,a;
for(int &i = cur[u]; ~i; i = e[i].next) {
if(e[i].flow > && d[e[i].to] == d[u]+&&(a=dfs(e[i].to,min(low,e[i].flow)))) {
e[i].flow -= a;
e[i^].flow += a;
low -= a;
tmp += a;
rec[cnt++] = make_pair(i,a);
rec[cnt++] = make_pair(i^,-a);
if(!low) break;
}
}
if(!tmp) d[u] = -;
return tmp;
}
int dinic() {
int ans = ;
cnt = ;
while(bfs()) {
memcpy(cur,head,sizeof(head));
ans += dfs(S,INF);
}
return ans;
}
void release(){
for(int i = ; i < cnt; ++i)
e[rec[i].first].flow += rec[i].second;
}
vector< pii >ans;
int main() {
int u,v,w,cs = ;
while(scanf("%d %d %d",&N,&E,&C),N||E||C) {
memset(head,-,sizeof(head));
S = ;
T = N;
for(int i = ; i < E; ++i) {
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
}
int flow = dinic();
printf("Case %d: ",cs++);
if(flow >= C) puts("possible");
else {
ans.clear();
for(int i = ; i < tot; i += ) {
if(e[i].flow == ){
e[i].flow = C;
if(flow + dinic() >= C) ans.push_back(make_pair(e[i^].to,e[i].to));
release();
e[i].flow = ;
}
}
if(ans.size()){
printf("possible option:");
sort(ans.begin(),ans.end());
for(int i = ,j = ans.size(); i < j; ++i)
printf("(%d,%d)%c",ans[i].first,ans[i].second,i+==j?'\n':',');
}else puts("not possible");
}
}
return ;
}

这样写 快很多啊

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
struct arc {
int to,flow,next;
arc(int x = ,int y = ,int z = -) {
to = x;
flow = y;
next = z;
}
};
arc e[maxn*];
int head[maxn],d[maxn],cur[maxn];
int tot,S,T,N,E,C,cnt;
void add(int u,int v,int flow) {
e[tot] = arc(v,flow,head[u]);
head[u] = tot++;
e[tot] = arc(u,,head[v]);
head[v] = tot++;
}
bool bfs() {
memset(d,-,sizeof(d));
queue<int>q;
d[T] = ;
q.push(T);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = head[u]; ~i; i = e[i].next) {
if(e[i^].flow > && d[e[i].to] == -) {
d[e[i].to] = d[u] + ;
q.push(e[i].to);
}
}
}
return d[S] > -;
}
pii rec[maxn*];
int dfs(int u,int low) {aaa
if(u == T) return low;
int tmp = ,a;
for(int &i = cur[u]; ~i; i = e[i].next) {
if(e[i].flow > && d[u] == d[e[i].to]+&&(a=dfs(e[i].to,min(low,e[i].flow)))) {
e[i].flow -= a;
e[i^].flow += a;
low -= a;
tmp += a;
rec[cnt++] = make_pair(i,a);
rec[cnt++] = make_pair(i^,-a);
if(!low) break;
}
}
if(!tmp) d[u] = -;
return tmp;
}
int dinic() {
int ans = ;
cnt = ;
while(bfs()) {
memcpy(cur,head,sizeof(head));
ans += dfs(S,INF);
}
return ans;
}
void release(){
for(int i = ; i < cnt; ++i)
e[rec[i].first].flow += rec[i].second;
}
vector< pii >ans;
int main() {
int u,v,w,cs = ;
while(scanf("%d %d %d",&N,&E,&C),N||E||C) {
memset(head,-,sizeof(head));
S = ;
T = N;
for(int i = ; i < E; ++i) {
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
}
int flow = dinic();
printf("Case %d: ",cs++);
if(flow >= C) puts("possible");
else {
ans.clear();
for(int i = ; i < tot; i += ) {
if(e[i].flow == ){
e[i].flow = C;
if(flow + dinic() >= C) ans.push_back(make_pair(e[i^].to,e[i].to));
release();
e[i].flow = ;
}
}
if(ans.size()){
printf("possible option:");
sort(ans.begin(),ans.end());
for(int i = ,j = ans.size(); i < j; ++i)
printf("(%d,%d)%c",ans[i].first,ans[i].second,i+==j?'\n':',');
}else puts("not possible");
}
}
return ;
}

UVA 11248 Frequency Hopping的更多相关文章

  1. UVA 11248 - Frequency Hopping(网络流量)

    UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...

  2. uva 11248 Frequency Hopping (最大流)

    uva 11248 Frequency Hopping 题目大意:给定一个有向网络,每条边均有一个容量. 问是否存在一个从点1到点N.流量为C的流.假设不存在,能否够恰好改动一条弧的容量,使得存在这种 ...

  3. UVa 11248 Frequency Hopping (网络流)

    题意:给定上一个网络,每个边有一个容量,问你能不能从 1 到 n,使得流量为 c,如果不能,那么是不是可以修改一条边,使得达到. 析:背景就是一个网络流,如果原图能跑出来,那么就不用了,就肯定能达到, ...

  4. Uvaoj 11248 Frequency Hopping(Dinic求最小割)

    题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出 ...

  5. Uva 11248 网络扩容

    题目链接:https://vjudge.net/contest/144904#problem/A 题意:给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否 ...

  6. uva 10801 - Lift Hopping(最短路Dijkstra)

    /* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...

  7. UVa 10801 - Lift Hopping(dijkstra最短路)

    根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...

  8. UVa 821 Page Hopping【Floyd】

    题意:给出一个n个点的有向图,任意两个点之间都相互到达,求任意两点间最短距离的平均值 因为n很小,所以可以用floyd 建立出图,然后用floyd,统计d[][]不为0且不为INF的边的和及条数,就可 ...

  9. UVA 10801 Lift Hopping 电梯换乘(最短路,变形)

    题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...

随机推荐

  1. 小程序做一个能够左右滑动切换的多tab页面

    主要原理:使用 <swiper> 和 <scroll-view> 组件 代码片段: https://developers.weixin.qq.com/s/mLx4FWmF757 ...

  2. HDU 1348 Wall ( 凸包周长 )

    链接:传送门 题意:给出二维坐标轴上 n 个点,这 n 个点构成了一个城堡,国王想建一堵墙,城墙与城堡之间的距离总不小于一个数 L ,求城墙的最小长度,答案四舍五入 思路:城墙与城堡直线长度是相等的, ...

  3. [读书笔记] R语言实战 (二) 创建数据集

    R中的数据结构:标量,向量,数组,数据框,列表 1. 向量:储存数值型,字符型,或者逻辑型数据的一维数组,用c()创建 **  R中没有标量,标量以单元素向量的形式出现 2. 矩阵:二维数组,和向量一 ...

  4. WIN10 java环境变量问题之 配置的JDK1.8版本却是1.7

    问题前沿,在开发项目中,发布的项目出现了内存溢出问题,我挨个把代码看了一遍,并不能准确定位到那个地方能出现内存溢出问题,后来想到使用压力测试,较可能出现内存溢出的接口进行一番测试. 我就安装了一个ap ...

  5. Linux系统串口接收数据编

    http://blog.csdn.net/bg2bkk/article/details/8668576 之前基于IBM deveplopworks社区的代码,做了串口初始化和发送的程序,今天在此基础上 ...

  6. 使用iframe标签时如何通过jquery隐藏滚动条

    通过mouseover和mouseout事件来控制iframe的滚动条 代码如下:

  7. OO第三单元总结——JML规格设计

    • 1.JML语言的理论基础.应用工具链情况 JML(Java Modeling Language)—— java建模语言,是一种行为接口规范语言( behavioral interface spec ...

  8. MyBatis学习总结(1)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  9. ZOJ 3329

    方程很明显有 d[i]=sum(pk*d[i+k])+p0*d[0]; 其中pi可以在开始时枚举求出. 设d[i]=A[i]*d[0]+B[i], 代入上式 d[i]=(sum(pk*A[i+k])+ ...

  10. 关于amd64和ia64的理解

    关于amd64和ia64的理解 学习了:http://blog.csdn.net/zubin006/article/details/5060383 IA64指的是Intel安腾系列CPU,不是X86架 ...