Problem: 八中生成树2
Time Limit: 1 Sec Memory Limit: 128 MB[Submit][Status][Web Board]
Description
八中里面有N个建设物,M条边。
对于这种要建最小生成树的问题,你应该很熟练了。
现在老大决定降低某条边的费用,然后这条边必须要被选中,因为这条路他每天都要走,自然......
问选了这条边后是否可以得到一个比从前总开支相等或更小的方案。
对于这种要建最小生成树的问题,你应该很熟练了。
现在老大决定降低某条边的费用,然后这条边必须要被选中,因为这条路他每天都要走,自然......
问选了这条边后是否可以得到一个比从前总开支相等或更小的方案。
Input
第一行三个整数N,M,Q(1<=N<=10000,N-1<=M<=100000,0
接下来M行,每行三个整数(X,Y,Z)描述一条可以建造的路。 0<=Z<=10000
最后Q行,每行两个整数i,x(1<=i<=M,0<=x)描述一个修改计划,
即要你判断如果 将第i条公路的修建费用降低为x元后,是否可以得到一个比从前总开支相等或更小的方案
接下来M行,每行三个整数(X,Y,Z)描述一条可以建造的路。 0<=Z<=10000
最后Q行,每行两个整数i,x(1<=i<=M,0<=x)描述一个修改计划,
即要你判断如果 将第i条公路的修建费用降低为x元后,是否可以得到一个比从前总开支相等或更小的方案
Output
按顺序输出Q行,每行输出"Yes"或"No",Yes表示可以建造,No表示不可能
Sample Input
3 4 3
1 2 10
1 3 6
2 3 4
1 3 7
4 6
1 7
1 5
Sample Output
Yes
No
Yes
HINT
#include<stdio.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define maxn 1005
const int INF=0x3fffffff;
int n,m,k;
int G[maxn][maxn],mx[maxn][maxn];
int pre[maxn],low[maxn],vis[maxn];
int e=1;
struct Edge {
int u,v,w;
} edge[maxn*100];
void Prim() {
memset(vis,0,sizeof(vis));
int pos=1;
for(int i=1; i<=n; i++) low[i]=G[pos][i];
low[pos]=0,vis[pos]=1,pre[pos]=1;
for(int i=1; i<=n; i++) {
int min=INF;
for(int j=1; j<=n; j++)
if(!vis[j]&&low[j]<min)
min=low[pos=j];
for(int j=1; j<=n; j++)
if(vis[j])
mx[pos][j]=max(mx[j][pre[pos]],low[pos]),
mx[j][pos]=mx[pos][j];
vis[pos]=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&low[j]>G[pos][j])
low[j]=G[pos][j],
pre[j]=pos;
}
}
int main() {
scanf("%d %d %d",&n,&m,&k);
memset(G,63,sizeof(G));
memset(mx,0,sizeof(mx));
for(int i=1; i<=n; i++) G[i][i]=0;
int u,v,w;
while(m--) {
scanf("%d %d %d",&u,&v,&w);
edge[e].u=u;
edge[e].v=v;
edge[e].w=w;
e++;
G[u][v]=G[v][u]=min(G[u][v],w);
}
Prim();
int num,c;
while(k--) {
scanf("%d %d",&num,&c);
puts(mx[edge[num].u][edge[num].v]<c?"No":"Yes");
}
}