日常读错题。无向图看成有向图,De了一下午bug。。。
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 const int N=157,inf=0x7fffffff;
11 typedef long long LL;
12 using namespace std;
13 int T,n,m,a[N],b[N],dis[N][N];
14
15 template<typename T>void read(T &x) {
16 char ch=getchar(); x=0; T f=1;
17 while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘)) ch=getchar();
18 if(ch==‘-‘) f=-1,ch=getchar();
19 for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; x*=f;
20 }
21
22 struct edge {
23 int u,v,fl,cap,nx;
24 edge(){}
25 edge(int u,int v,int fl,int cap,int nx):u(u),v(v),fl(fl),cap(cap),nx(nx){}
26 }e[N*N];
27
28 int fir[N],cur[N],ecnt,p[N];
29 void add(int u,int v,int cap) {
30 e[++ecnt]=edge(u,v,0,cap,fir[u]); fir[u]=ecnt;
31 e[++ecnt]=edge(v,u,0,0,fir[v]); fir[v]=ecnt;
32 }
33
34 int calc(int s,int t) {
35 int fl=inf;
36 for(int i=t;i!=s;i=e[p[i]].u)
37 fl=min(fl,e[p[i]].cap-e[p[i]].fl);
38 for(int i=t;i!=s;i=e[p[i]].u)
39 e[p[i]].fl+=fl,e[p[i]^1].fl-=fl;
40 return fl;
41 }
42
43 int d[N],c[N];
44 queue<int>que;
45 int bfs(int s,int t) {
46 que.push(t);
47 d[t]=0;
48 while(!que.empty()) {
49 int x=que.front();
50 que.pop();
51 for(int i=fir[x];i;i=e[i].nx) if(d[e[i].v]==n&&e[i].cap==0) {
52 d[e[i].v]=d[x]+1;
53 que.push(e[i].v);
54 }
55 }
56 }
57
58 int ISAP(int s,int t) {
59 memset(c,0,sizeof(c));
60 for(int i=1;i<=n;i++) d[i]=n,cur[i]=fir[i];
61 bfs(s,t);
62 for(int i=1;i<=n;i++) c[d[i]]++;
63 int res=0;
64 for(int x=s;d[x]<n;) {
65 if(x==t) {
66 res+=calc(s,t);
67 x=s;
68 }
69 int ok=0;
70 for(int &i=cur[x];i;i=e[i].nx) if(d[e[i].v]+1==d[x]&&e[i].cap>e[i].fl) {
71 p[x=e[i].v]=i; ok=1; break;
72 }
73 if(!ok) {
74 cur[x]=fir[x]; int M=n;
75 for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl)
76 M=min(M,d[e[i].v]+1);
77 if(!(--c[d[x]])) break;
78 c[d[x]=M]++;
79 if(x!=s) x=e[p[x]].u;
80 }
81 }
82 return res;
83 }
84
85 int vis[N];
86 void dfs(int x) {
87 vis[x]=1;
88 for(int i=fir[x];i;i=e[i].nx) if(!vis[e[i].v]&&e[i].fl<e[i].cap)
89 dfs(e[i].v);
90 }
91
92 void restore() { for(int i=2;i<=ecnt;i++) e[i].fl=0; }
93
94
95 void solve(int l,int r) {
96 if(l>=r) return;
97 restore();
98 int t=ISAP(a[l],a[r]),L=l-1,R=r+1;
99 memset(vis,0,sizeof(vis));
100 dfs(a[l]);
101 for(int i=1;i<=n;i++) if(vis[i])
102 for(int j=1;j<=n;j++) if(!vis[j])
103 dis[i][j]=dis[j][i]=min(dis[i][j],t);
104 for(int i=l;i<=r;i++)
105 if(vis[a[i]]) b[++L]=a[i];
106 else b[--R]=a[i];
107 for(int i=l;i<=r;i++) a[i]=b[i];
108 solve(l,L); solve(R,r);
109 }
110
111 int main() {
112 read(T);
113 while(T--) {
114 ecnt=1;
115 memset(fir,0,sizeof(fir));
116 memset(dis,127/3,sizeof(dis));
117 read(n); read(m);
118 for(int i=1;i<=m;i++) {
119 int u,v,w;
120 read(u); read(v); read(w);
121 add(u,v,w);
122 add(v,u,w);
123 }
124 for(int i=1;i<=n;i++) a[i]=i;
125 solve(1,n);
126 int q,xx;
127 read(q);
128 while(q--) {
129 read(xx);
130 int ans=0;
131 for(int i=1;i<=n;i++)
132 for(int j=i+1;j<=n;j++)
133 if(dis[i][j]<=xx) ans++;
134 printf("%d\n",ans);
135 }
136 puts("");
137 }
138 return 0;
139 }
140 /*
141 1
142 5 0
143 1
144 0
145 */