题目链接

AMRExchange is the latest cryptocurrency exchange that has become very popular among cryptocurrency traders.

On AMRExchange, there are N cryptocurrencies - let us denote the ith currency by Ci. Mpairs of these cryptocurrencies are tradable - one unit of currency Cx can be converted to one unit of currency Cy with risk Cxy.

Mr. X, an avid cryptocurrency collector, wants to start with 1 unit of any of the Ncryptocurrencies and perform a sequence of trades. He wants to do it in such a way that for each of the N cryptocurrencies, there was at least one point during the trading sequence during which he held one unit of that cryptocurrency.

The overall risk of the sequence of trades is the maximum risk in the sequence of trades. Minimize the overall risk with which Mr. X can achieve this. Print "Impossible" if no such sequence of trades is possible.

Input

  • The first line contains a single integer T - the total number of testcases.
  • Each testcase is of the following format:
    • First line contains 2 space-separated integers - N and M. N denotes the number of cryptocurrencies, M denotes the number of tradable ordered cryptocurrency pairs.
    • M lines follow. Each line contains 3 space-separated positive integers - Cx, Cyand Cxy. This line denotes that one unit of currency Cx can be converted into one unit of currency Cy with risk Cxy.

Output

  • For each testcase, print the minimum overall risk with which Mr. X can own at least one unit of each cryptocurrency at some point in time.
  • If it is not possible for Mr. X to achieve this, then print “Impossible”.

Constraints

  • 1 ≤ T ≤ 5
  • 1 ≤ N, M ≤ 105
  • 1 ≤ Cx, Cy ≤ N
  • 1 ≤ Cxy ≤ 109

Example

Input
2
3 6
1 2 1
2 3 3
3 1 3
1 3 1
3 2 1
3 2 5
4 3
1 2 1
2 3 1
2 4 1 Output
1
Impossible

Explanation

Testcase 1: Mr. X can start with cryptocurrency C1 and follow the following sequence to minimize overall risk:

  • Convert C1 to C3 with risk 1.
  • Convert C3 to C2 with risk 1.

The overall risk would be 1.

Testcase 2: There are a total of 6 sequences of trades are possible, and none of them satisfy our property. We list them here:

Starting with C1:

  • C1 -> C2 -> C3
  • C1 -> C2 -> C4

In the first sequence, Mr. X won't be able to own C4 because units of C3 cannot be converted to units of C4. Similarly, in the second sequence, Mr. X won't be able to own C3 because units of C4 cannot be converted to units of C3.

Starting with C2:

  • C2 -> C3
  • C2 -> C4

Starting with C3:

  • C3 (cannot be converted to any other cryptocurrency)

Starting with C4:

  • C4 (cannot be converted to any other cryptocurrency)

Hence, there is no possible sequence using which Mr. X can own one unit of all cryptocurrencies at some point in time.

题意 

给一个有边权的图,找出最小的权值,使得以这个权值能走遍所有的点。

分析 

二分权值。对于某个权值,以这个权值为基准来缩点,构建出新的简单有向图,然后求出拓扑序,检查是否可以形成链状。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include <queue>
#include <vector>
#include<bitset>
#include<map>
#include<deque>
#include<stack>
using namespace std;
typedef pair<int,int> pii;
#define X first
#define Y second
#define pb push_back
#define mp make_pair
#define ms(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+;
const int mod = +;
#define lson l,m,2*rt
#define rson m+1,r,2*rt+1
typedef long long ll;
vector<pii> G[maxn];
vector<int> g[maxn];
int indeg[maxn];
int n,m;
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_block,scc_cnt;
stack<int> S;
void dfs(int u,int lim){
pre[u]=lowlink[u]=++dfs_block;
S.push(u);
for(int i=;i<G[u].size();i++){
if(G[u][i].Y>lim) continue;
int v=G[u][i].X;
if(!pre[v]){
dfs(v,lim);
lowlink[u]=min(lowlink[u],lowlink[v]);
}else if(!sccno[v]){
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]){
scc_cnt++;
while(){
int x=S.top();S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
return;
}
void find_scc(int n,int lim){
dfs_block=scc_cnt=;
ms(sccno,);
ms(pre,);
for(int i=;i<=n;i++){
if(!pre[i]) dfs(i,lim);
}
return;
} bool check(int mid){
ms(indeg,);
for(int i=;i<=scc_cnt;i++){
g[i].clear();
}
find_scc(n,mid);
for(int i=;i<=n;i++){
for(int j=;j<G[i].size();j++){
int u,v,w;
u=i;
v=G[i][j].X;
w=G[i][j].Y;
if(w>mid) continue;
if(sccno[u]==sccno[v]) continue;
g[sccno[u]].pb(sccno[v]);
indeg[sccno[v]]++;
}
} queue<int> que;
for(int i=;i<=scc_cnt;i++) if(indeg[i]==) que.push(i);
vector<int> topu;
while(!que.empty()){
int now=que.front();
que.pop();
topu.pb(now);
for(int i=;i<g[now].size();i++){
indeg[g[now][i]]--;
if(indeg[g[now][i]]==){
que.push(g[now][i]);
}
}
} if(topu.size()<=) return true;
for(int i=;i<topu.size()-;i++){
int now=topu[i];
bool flag=;
for(int j=;j<g[now].size();j++){
int tmp=g[now][j];
if(tmp==topu[i+]){
flag=;
break;
}
}
if(!flag){
return false;
}
}
return true;
}
void solve(){
int l=,r=1e9+;
int mid;
int ans=inf;
while(l<=r){
mid=(l+r)>>;
if(check(mid)){
r=mid-;
ans=min(mid,ans);
}else l=mid+;
}
if(ans==inf) puts("Impossible");
else printf("%d\n",ans);
} int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int t,u,v,w;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) G[i].clear();
for(int i=;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
G[u].pb(mp(v,w));
}
solve();
}
return ;
}

CodeChef - CRYPCUR的更多相关文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  4. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  5. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

  6. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  7. CodeChef FNCS

    题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...

  8. codechef Prime Distance On Tree(树分治+FFT)

    题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...

  9. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

随机推荐

  1. [转帖]浪潮openstack的逆袭

    扬长补短 浪潮云平台的逆袭 http://blog.itpub.net/11310314/viewspace-2564083/ 浪潮并不是最早加入OpenStack的国内厂商,却实现同比303.1%的 ...

  2. Linux初学笔记---关于进程管理等

    菜鸟初学: 1. 查看进程用的命令: ps 具体用法 ps -A ro ps -e 显示所有进程 ps -u root 显示root 用户的进程 ps -u root -N 显示非root用户的进程 ...

  3. (String)强制转换、toString()和String.valueOf()的区别

    String:毫无疑问,这种就是强转形式,简单方便,效率高.java程序员可能看到效率高或许有些激动,但是它有他的不好,那就是局限性.在java的世界里没有什么东西是没有缺点的,总有一些好的方面同时也 ...

  4. SQL Server 公用表表达式(CTE)实现递归

    公用表表达式简介: 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集.CTE 与派生表类 ...

  5. BZOJ1367 BOI2004Sequence(左偏树)

    首先考虑把bi和ai同时减i,问题变为非严格递增.显然如果a是一个递减序列,b序列所有数都取其中位数最优.于是划分原序列使得每一部分递减,然后考虑合并相邻两段.如果前一段的中位数<=后一段的中位 ...

  6. Luogu3297 SDOI2013逃考(半平面交+最短路)

    把每个人的监视范围看成点,相邻的两个监视范围连边,那么跑一遍最短路就可以了(事实上边权都为1可以直接bfs).显然存在最优路线没有某个时刻同时被多于两人监视,要到达另一个区域的话完全可以经过分界线而不 ...

  7. Code First 重复外键(简单方法)

    之前有说过  Code First 重复外键   的一种解决方案.   http://blog.csdn.net/hanjun0612/article/details/50478134 虽然可以解决问 ...

  8. MT【22】一道分母为混合型的放缩

    评:指数函数增长>幂函数增长>对数函数增长.

  9. 在 Ali Kubernetes 系统中,我们这样实践混沌工程

    在传统的软件测试中,我们通常通过一个给定的条件来判断系统的反馈,通过断言来判断是否符合预期,测试条件和结果通常比较明确和固定.而混沌工程,是通过注入一些“不确定”因素,象放进了一群淘气的猴子,在系统资 ...

  10. 找到第一个只出现一次的字符并返回它的位置(Python)

    s = 'hellobaby' def findchar(s): for i in s: if s.count(i)==1: return i, s.index(i) m,n=findchar(s) ...