uva11865
2015-11-06 17:33
288 查看
思路:二分+最小形图。
// #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <limits.h> #define DEBUG #ifdef DEBUG #define debug(...) printf( __VA_ARGS__ ) #else #define debug(...) #endif #define MEM(x,y) memset(x, y,sizeof x) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; // int n,m,c; int t; const int maxn = 1e4 + 10; int in[maxn], pre[maxn]; int id[maxn], vis[maxn]; struct Node{ int u,v,cost; int wide; bool operator < (const Node& b)const{ return this->wide < b.wide; } }E[maxn], tmp[maxn]; int Drected_MST(int root,int n,int m,int wide){ int ret = 0; // return -1; memcpy(tmp, E,sizeof tmp); while(true){ MEM(in,INF); for (int i = 0;i < m;i++){ int u = tmp[i].u, v = tmp[i].v; if (tmp[i].cost < in[v] && u != v && tmp[i].wide >= wide){ pre[v] = u; in[v] = tmp[i].cost; } }//连通性的判断 for (int i = 0;i < n;i++){ if (i == root) continue; if (in[i] == INF) return -1; } // debug("####\n"); int cnt = 0; MEM(id, -1); MEM(vis, -1); in[root] = 0;
<span style="white-space:pre"> </span>//环的检测
for (int i = 0;i < n;i++){ ret += in[i]; int v = i; while(vis[v] != i && id[v] == -1 && v != root){ vis[v] = i; v = pre[v]; } if (v != root && id[v] == -1){ for (int u = pre[v];u != v;u = pre[u]){ id[u] = cnt; } id[v] = cnt++;// } } if (cnt == 0) break;//无环直接输出答案。 for (int i = 0;i < n;i++){//对独立的点进行标记 if (id[i] == -1){ id[i] = cnt++; } } for (int i = 0;i < m;i++){ int v = tmp[i].v; tmp[i].u = id[tmp[i].u]; tmp[i].v = id[tmp[i].v]; if (tmp[i].u != tmp[i].v) tmp[i].cost -= in[v]; } n = cnt; root = id[root]; } return ret; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int n,m,c; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&c); int low = INF, high = -INF; for (int i = 0;i < m;i++){ scanf("%d%d%d%d",&E[i].u,&E[i].v,&E[i].wide,&E[i].cost); low = min(E[i].wide,low); high = max(E[i].wide,high); } sort(E,E+m); // debug("high = %d\t,low = %d\n",high,low); int num = Drected_MST(0,n,m,0); if (num == -1 || num > c){ puts("streaming not possible."); continue; } while(low <= high){ int mid = (low + high)/2; int check = Drected_MST(0,n,m,mid); if (check == -1 || check > c){ high = mid - 1; }else low = mid + 1; } printf("%d kbps\n",high); } return 0; }
相关文章推荐
- MySQL索引类型 btree索引和hash索引的区别
- 上传图片【应用服务器与文件服务器(图片)分离】
- 导出excel时因字段过长导致的hresult:0x800a03ec错误解决办法
- 可视化数据分析(三) 一个简单的散点图的实现
- 2015第五届深度操作系统开发者与用户大会,期待您的参与!
- hdoj 1171Big Event in HDU【dp】
- 基于DOS的多任务系统的实现
- hdu 1867 A + B for you again
- 一台机器安装多个MySQL
- IOC容器——Unity
- WS+MQ+WCF+EF(Code First)
- C++获取数字证书的序列号
- centos发送邮件
- haproxy+heartbeat的两种方案(注意,备服务器vip,正常haproxy启动方法)
- 类 Mat导言
- libevent代码阅读(11)——“hello-world.c”之 进入事件多路分发循环
- 1097. Deduplication on a Linked List
- MongoDB的用户管理(6)
- c#在一般处理程序中使用session
- mysql数据库设置不区分大小写