锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
/**//*
涓嶉敊涓閬撻
棰樻剰錛氱粰鍑轟竴騫呭浘錛岄噷闈㈡湁妗ワ紝緇欏嚭Q涓搷浣滐紝 姣忎釜鎿嶄綔浼氭坊鍔犱竴鏉¤竟錛岄棶姣忔鎿嶄綔鍚庡浘涓ˉ鐨勪釜鏁?br>
姣忔姹傛ˉ浼氬お鎱?br>
鑰冭檻涓涓媎fs鏍戯紝鏍戣竟鑲畾鏄ˉ錛岀劧鍚庢瘡榪炰笂x,y錛屽氨浼氬艦鎴愪竴涓幆錛岃繖涓幆鍐呯殑杈瑰氨鍏ㄩ儴閮戒笉鏄壊杈?br>
鎵浠ュ彧瑕佹壘鍒皒,y鐨刲ca錛屾妸榪欎釜璺緞涓婄殑妗ユ爣璁頒負鍚﹀嵆鍙?br>
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100010;

inline int min(int a,int b)
{return a<b?a:b;}
inline int max(int a,int b)
{return a>b?a:b;}

struct Node
{
int v,next;
}nodes[MAXN*10];
int G[MAXN];
int level[MAXN],low[MAXN];
int vi[MAXN],fa[MAXN];
int cut[MAXN],isBridge[MAXN];
int alloc,n,m,bridgeNum;

void add(int a,int b)
{
alloc++;
nodes[alloc].v=b,nodes[alloc].next=G[a];
G[a]=alloc;
}

void dfs(int u,int dep)
{
vi[u]=1;
level[u]=low[u]=dep;
bool flag=true;
//if(u!=1)cut[u]++;
for(int son=G[u];son;son=nodes[son].next)
{
int v=nodes[son].v;
if(v==fa[u]&&flag)
{
flag=false;
continue;
}
if(vi[v]==1)
low[u]=min(low[u],level[v]);
else if(vi[v]==0)
{
fa[v]=u;
dfs(v,dep+1);
low[u]=min(low[u],low[v]);
//if(low[v]>=level[u])cut[u]++;
if(low[v]>level[u])
{//bridge
isBridge[v]=1;
bridgeNum++;
}
}
}
vi[u]=2;
}
void lca(int x,int y)
{
if(level[x]<level[y])swap(x,y);
while(level[x]>level[y])
{
if(isBridge[x])
{
bridgeNum--;
isBridge[x]=0;
}
x=fa[x];
}
while(x!=y)
{
if(isBridge[x])
{bridgeNum--;isBridge[x]=0;}
if(isBridge[y])
{bridgeNum--;isBridge[y]=0;}
x=fa[x];y=fa[y];
}
}
int main()
{
//freopen("in","r",stdin);
int a,b,t=1;
while(scanf("%d%d",&n,&m),n)
{
alloc=0;
memset(G+1,0,sizeof(int)*n);
while(m--)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
memset(vi,0,sizeof(vi));
memset(isBridge,0,sizeof(isBridge));
bridgeNum=0;
fa[1]=1;
dfs(1,0);
printf("Case %d:\n",t++);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&a,&b);
lca(a,b);
printf("%d\n",bridgeNum);
}
puts("");
}
return 0;
}
]]>
]]>

/**//*
姹傛渶灝忓姞杈逛嬌鏈夊悜鍥懼彉涓哄己榪為?br>
鍏堢緝鐐癸紝鐒跺悗璁$畻鍚勪釜寮鴻繛閫氬垎閲忕殑鍏ュ害涓?鐨勪釜鏁幫紝鍑哄害涓?鐨勪釜鏁?br>
1) SCC=1, 涓嶉渶娣昏竟
2) 娣籱ax( incnt, outcnt )
璐績絳栫暐錛屾眹鍩哄悜鐐瑰熀榪炶竟錛屽啀娣昏竟鐨勮繛鎺ュ墿涓嬬殑鐐瑰熀/姹囧熀鍗沖彲
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=20010;
int n,m;
vector<int>G[2][MAXN];
int ID[MAXN],SCC,flag;
int order[MAXN],cnt;
int in[MAXN],out[MAXN];

void dfs(int u)
{
ID[u]=SCC;
for(int i=0;i<G[flag][u].size();i++)
{
int v=G[flag][u][i];
if(!ID[v])dfs(v);
}
if(flag)order[++cnt]=u;
}

int main()
{
int T,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
G[0][i].clear();
G[1][i].clear();
}
while(m--)
{
scanf("%d%d",&a,&b);
G[0][a].push_back(b);
G[1][b].push_back(a);
}
flag=SCC=1;
cnt=0;
memset(ID,0,sizeof(ID));
for(int i=1;i<=n;i++)
if(!ID[i])dfs(i);
flag=SCC=0;
memset(ID,0,sizeof(ID));
for(int i=cnt;i;i--)
{//娉ㄦ剰鏄痮rder[i]
if(ID[order[i]])continue;
SCC++;
dfs(order[i]);
}
if(SCC==1)
{puts("0");continue;}
memset(out,0,sizeof(out));
memset(in,0,sizeof(in));
for(int i=1;i<=n;i++)
for(int j=0;j<G[0][i].size();j++)
{
int v=G[0][i][j];
if(ID[i]!=ID[v])
{
in[ID[v]]++;
out[ID[i]]++;
}
}
int incnt=0,outcnt=0;
for(int i=1;i<=SCC;i++)
{
if(in[i]==0)incnt++;
if(out[i]==0)outcnt++;
}
printf("%d\n",max(incnt,outcnt));
}
return 0;
}
/**//*
姹俿鍒皌鐨勬渶鐭礬涓庢鐭礬錛堣繖閲岃姹傚彧姣旀渶鐭礬澶?錛夌殑鏉℃暟涔嬪拰
鑱旀兂鍒版渶灝忥紝嬈″皬鐨勪竴縐嶆洿鏂板叧緋伙細
if(x<鏈灝?鏇存柊鏈灝忥紝嬈″皬
else if(==鏈灝?鏇存柊鏂規(guī)硶鏁?br>
else if(x<嬈″皬)鏇存柊嬈″皬
else if(x==嬈″皬)鏇存柊鏂規(guī)硶鏁?br>
鍚屾椂璁板綍s鍒皍鏈鐭紝嬈$煭璺強鏂規(guī)硶鏁?br>
鐢ㄤ竴涓爢姣忔鍙栨渶灝忕殑錛屾洿鏂板畬鍚庡啀鍏ュ爢
榪樻槸閭d釜鍘熺悊錛岀涓嬈¢亣鍒扮殑灝辨槸鏈浼樼殑錛岀劧鍚巚i鏍囪涓虹湡
鏂規(guī)硶鏁版敞鎰忔槸鍔犳硶鍘熺悊錛屼笉鏄箻娉?br>
\
-- u -- v 鎵浠ユ槸鍔犳硶鍘熺悊
/
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=1010;
const int INF=1000000000;
bool vi[MAXN][2];
int dist[MAXN][2],cnt[MAXN][2];//0 琛ㄧず鏈鐭礬 1琛ㄧず嬈$煭璺?/span>
int G[MAXN];
int n,m,alloc;

struct Node
{
int v,w,next;
}nodes[MAXN*10];

struct Pos
{
int v,flag;
Pos(int vv,int f)
{v=vv,flag=f;}
bool operator<(const Pos &p)const
{
return dist[v][flag]>dist[p.v][p.flag];
}
};

void add(int a,int b,int c)
{
alloc++;
nodes[alloc].v=b,nodes[alloc].w=c,nodes[alloc].next=G[a];
G[a]=alloc;
}

int dij(int s,int t)
{
memset(vi,0,sizeof(vi));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)
dist[i][0]=dist[i][1]=INF;
priority_queue<Pos>Q;
Q.push(Pos(s,0));
dist[s][0]=0;cnt[s][0]=1;
while(!Q.empty())
{
Pos top=Q.top();Q.pop();
int u=top.v,flag=top.flag;
if(vi[u][flag])continue;
vi[u][flag]=1;
for(int son=G[u];son;son=nodes[son].next)
{
int v=nodes[son].v,w=dist[u][flag]+nodes[son].w;
if(w<dist[v][0])
{
if(dist[v][0]!=INF)
{
dist[v][1]=dist[v][0];
cnt[v][1]=cnt[v][0];
Q.push(Pos(v,1));
}
dist[v][0]=w;
cnt[v][0]=cnt[u][flag];
Q.push(Pos(v,0));
}
else if(w==dist[v][0])cnt[v][0]+=cnt[u][flag];
else if(w<dist[v][1])
{
dist[v][1]=w;
cnt[v][1]=cnt[u][flag];
Q.push(Pos(v,1));
}
else if(w==dist[v][1])cnt[v][1]+=cnt[u][flag];
}
}
int ans=cnt[t][0];
if(dist[t][0]==dist[t][1]-1)ans+=cnt[t][1];
return ans;
}
int main()
{
int T,a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(G,0,sizeof(G));
alloc=0;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
scanf("%d%d",&a,&b);
printf("%d\n",dij(a,b));
}
return 0;
}

/**//*
棰樻剰錛氭湁N涓伐浠惰鍦∕涓満鍣ㄤ笂鍔犲伐錛屾湁涓涓狽*M鐨勭煩闃墊弿榪板叾鍔犲伐鏃墮棿銆?br>
鍚屼竴鏃墮棿鍐呮瘡涓満鍣ㄥ彧鑳藉姞宸ヤ竴涓伐浠訛紝闂姞宸ュ畬鎵鏈夊伐浠跺悗錛屼嬌寰楀鉤鍧囧姞宸ユ椂闂存渶灝忋?br>
灝嗗伐浠朵綔涓轟簩鍒嗗浘涓璛閮ㄧ殑鐐癸紝鎬誨叡N涓?br>
灝嗘瘡涓満鍣ㄦ媶鎴怤涓偣浣滀負浜屽垎鍥句腑Y閮ㄧ殑鐐癸紝鎬誨叡N*M涓?br>
絎琂涓満鍣ㄧ殑絎琍涓偣浠h〃錛屼嬌鐢ㄦ満鍣?nbsp;J榪涜鍊掓暟絎琍嬈″姞宸ャ?br>
鍋囪鎴戜滑鎸夐『搴忓湪J鏈哄櫒涓婂伐浠禝1,I2,I3..IK涓伐浠訛紝鍒欐誨叡闇瑕佽姳璐笽1*K+I2*(K- 1)+I3*(K-3)+
+IK銆?br>
鎵浠ユ垜浠浜嶺涓瘡涓偣I錛孻涓瘡涓偣錛圝,P錛夛紝榪炴帴涓鏉[I,J]*P鏉冨肩殑杈廣?br>
鎺ヤ笅鏉ヨ繘琛屼簩鍒嗗浘鏈浣?jīng)_尮閰嶅嵆鍙?br>
*/
#include<cstdio>
#include<cstring>
const int MAXN=55;
const int INF=1000000000;
int n,m;
int g[MAXN][MAXN*MAXN];
int data[MAXN][MAXN];
int lx[MAXN],ly[MAXN*MAXN];//鍙欏舵爣
int cx[MAXN],cy[MAXN*MAXN];//鍖歸厤杈歸泦
bool sx[MAXN],sy[MAXN*MAXN];

bool path(int u)
{//鎵╁睍浜屽垎鍥?nbsp;鍒ゆ柇鏄惁瀛樺湪鐢辮鍏冪礌u鍑哄彂鐨勫彲澧炲箍璺緞
sx[u]=1;
for(int v=1;v<=m;v++)
{
if(g[u][v]==lx[u]+ly[v]&&!sy[v])
{
sy[v]=1;
if(cy[v]==0||path(cy[v]))
{
cx[u]=v;cy[v]=u;
return true;
}
}
}
return false;
}
int KM()
{
memset(ly,0,sizeof(ly));
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
for(int i=1;i<=n;i++)
{
lx[i]=-INF;
for(int j=1;j<=m;j++)
if(lx[i]<g[i][j])lx[i]=g[i][j];
}
for(int u=1;u<=n;u++)
{
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
while(!path(u))
{
int Min=INF;
for(int i=1;i<=n;i++)
{
if(!sx[i])continue;
for(int j=1;j<=m;j++)
if(!sy[j]&&lx[i]+ly[j]-g[i][j]<Min)
Min=lx[i]+ly[j]-g[i][j];
}
//璋冩暣欏舵爣錛屼簩鍒嗗浘鎾ゅ幓璇ュ厓绱?/span>
for(int i=1;i<=n;i++)
if(sx[i])
{lx[i]-=Min;sx[i]=false;}
for(int i=1;i<=m;i++)
if(sy[i])
{ly[i]+=Min;sy[i]=false;}
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans+=g[i][cx[i]];
return ans;
} 
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&data[i][j]);
//build
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=n;k++)
g[i][(j-1)*n+k]=-data[i][j]*k;//鑺辮垂
m=n*m;
double ans=-1.0*KM()/n;
printf("%.6f\n",ans);
}
return 0;
}