UVA 11248 Frequency Hopping
Frequency Hopping
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的更多相关文章
- UVA 11248 - Frequency Hopping(网络流量)
UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...
- uva 11248 Frequency Hopping (最大流)
uva 11248 Frequency Hopping 题目大意:给定一个有向网络,每条边均有一个容量. 问是否存在一个从点1到点N.流量为C的流.假设不存在,能否够恰好改动一条弧的容量,使得存在这种 ...
- UVa 11248 Frequency Hopping (网络流)
题意:给定上一个网络,每个边有一个容量,问你能不能从 1 到 n,使得流量为 c,如果不能,那么是不是可以修改一条边,使得达到. 析:背景就是一个网络流,如果原图能跑出来,那么就不用了,就肯定能达到, ...
- Uvaoj 11248 Frequency Hopping(Dinic求最小割)
题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出 ...
- Uva 11248 网络扩容
题目链接:https://vjudge.net/contest/144904#problem/A 题意:给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否 ...
- uva 10801 - Lift Hopping(最短路Dijkstra)
/* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...
- UVa 10801 - Lift Hopping(dijkstra最短路)
根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...
- UVa 821 Page Hopping【Floyd】
题意:给出一个n个点的有向图,任意两个点之间都相互到达,求任意两点间最短距离的平均值 因为n很小,所以可以用floyd 建立出图,然后用floyd,统计d[][]不为0且不为INF的边的和及条数,就可 ...
- UVA 10801 Lift Hopping 电梯换乘(最短路,变形)
题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...
随机推荐
- 线段树合并(【POI2011】ROT-Tree Rotations)
线段树合并([POI2011]ROT-Tree Rotations) 题意 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有nn个叶子节点,满足这些权值为1-n1-n的一个 ...
- centos 登陆跳转指定目录
vi /etc/bashrc cd /usr/local 重启 reboot
- QT中文字的绘制
为什么要做这次文字的介绍,因为在一般的教材中,还真没有文字的描述: 1.绘制最简单的文字. 我们更改重绘函数如下: void Dialog::paintEvent(QPaintEvent *){QPa ...
- php获取时间是星期几
PHP星期几获取代码: date("l"); //data就可以获取英文的星期比如Sundaydate("w"); //这个可以获取数字星期比如123,注意0是 ...
- FastDFS 实现图片上传_01
一.jar 包 jar包下载:https://pan.baidu.com/s/1nwkAHU5 密码:tlv6 或者 下载工程,安装到 maven 本地仓库 工程下载:https://pan.baid ...
- GNU Linux中的SO_RCVLOWAT和SO_SNDLOWAT说明
/********************************************************************* * Author : Samson * Date ...
- C中操作文件的几种模式
使用文件的方式共同拥有12种,以下给出了它们的符号和意义. 文件打开方式 意义 rt 仅仅读打开一个文本文件.仅仅同意读数据 wt 仅仅写打开或建立一个文本文件,仅仅同意写数据 at 追 ...
- hdu1525 Euclid's Game , 基础博弈
http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 两人博弈,给出两个数a和b, 较大数减去较小数的随意倍数.结果不能小于0,将两个数随意一个数减到0 ...
- linux 数据库
查看数据库状态:service mysqld status 启动数据库服务 service mysql start 如果出现:Another MySQL daemon already running ...
- [Android] Android开发优化之——从代码角度进行优化
通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就 ...