Problem: 八中生成树2

Problem: 八中生成树2

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元后,是否可以得到一个比从前总开支相等或更小的方案

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

[ Submit][ Status]
#include
#include
#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++]=Edge{u,v,w};
        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");
	}
}

你可能感兴趣的:(Problem: 八中生成树2)