POJ 2831

次小生成树。求出两点间最短路径的最大权值,再把要加入的边与之比较即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int MAXN=1010;
 8 const int MAXM=100010;
 9 const int inf=100000000;
10 int map[MAXN][MAXN];
11 int edge[MAXM][3];
12 bool exist[MAXN][MAXN],used[MAXN][MAXN],vis[MAXN];
13 int f[MAXN][MAXN],dist[MAXN],pre[MAXN];
14 int m,n,q;
15 int ans1=0;
16 void init(){
17     for(int i=1;i<=n;i++){
18         vis[i]=false;
19         for(int j=i;j<=n;j++){
20             map[i][j]=map[j][i]=inf;
21             exist[i][j]=exist[j][i]=used[i][j]=used[j][i]=false;
22             f[i][j]=f[j][i]=0;
23         }
24     }
25 }
26
27 void prim(){
28     dist[1]=0;
29     for(int i=2;i<=n;i++){
30         dist[i]=map[1][i];
31         if(dist[i]!=inf)
32         pre[i]=1;
33         else pre[i]=-1;
34     }
35     vis[1]=true;
36     for(int i=1;i<=n;i++){
37         int min=inf,p=-1;
38         for(int k=1;k<=n;k++){
39             if(dist[k]<min&&!vis[k]){
40                 min=dist[k]; p=k;
41             }
42         }
43         if(p==-1) return ;
44         for(int k=1;k<=n;k++){
45             if(vis[k]){
46                 f[k][p]=max(f[k][pre[p]],map[pre[p]][p]);
47                 f[p][k]=f[k][p];
48             }
49         }
50         vis[p]=true;
51         for(int k=1;k<=n;k++){
52             if(!vis[k]&&map[p][k]<dist[k]){
53                 dist[k]=map[p][k];
54                 pre[k]=p;
55             }
56         }
57     }
58 }
59
60 int main(){
61     int u,v,d;
62     int c,w;
63     while(scanf("%d%d%d",&n,&m,&q)!=EOF){
64         init();
65         for(int i=1;i<=m;i++){
66             scanf("%d%d%d",&u,&v,&d);
67             edge[i][0]=u; edge[i][1]=v; edge[i][2]=d;
68             if(d<map[u][v])
69             map[u][v]=map[v][u]=d;
70         }
71         prim();
72         for(int i=1;i<=q;i++){
73             scanf("%d%d",&c,&w);
74             u=edge[c][0]; v=edge[c][1];
75             if(w<=f[u][v])
76             printf("Yes\n");
77             else printf("No\n");
78         }
79     }
80     return 0;
81 }

POJ 2831

时间: 2024-12-20 19:33:21

POJ 2831的相关文章

poj 2831 次小生成树模板

/*次小生成树 题意:给你一些路径,现在将一部分路径权值减少后问是否可以替代最小生成树里面的边. 解:次小生成树,即将这条边连上,构成一个环 求出任意两点路径之间的除了这条边的最大值,比较这个最大值>=这条边,说明可以替换. prime算法次小生成树模板 */ #include<stdio.h> #include<string.h> #define N 1100 #define inf 0x3fffffff int ma[N][N]; int Min(int a,int b)

POJ 2831 Can We Build This One:次小生成树【N^2预处理】

题目链接:http://poj.org/problem?id=2831 题意: 给你一个图,每条边有边权. 然后有q组询问(i,x),问你如果将第i条边的边权改为x,这条边是否有可能在新的最小生成树中. 题解: 更改边权相当于新添加了一条边. 新边在新MST中的充要条件是: 加入新边后,在原来的MST上形成的环中,有一条旧边的边权>=x. (因为如果这样的话,新边可以替换掉那条最大的边) 所以可以预处理出 maxn[i][j]:在原来的MST上,任意两点间路径上的最大边权. dfs即可. 对于每

POJ 2831 Can We Build This One?

Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1728   Accepted: 643 Case Time Limit: 2000MS Description “Highways are built, then life is rich.” Now people of Big Town want to become rich, so they are planning to build highways to conne

poj 2831(次小生成树)

题意:给你一幅图,再给你Q个询问,每个询问为id cost,即如果将id这条边的边权改为cost的话,这条边是否可能是最小生成树中的一条边 解题思路:将第i条边(u,v)的权值修改的话,要判断是否是最小生成树中的一条边,首先要把它加入进去,此时必定会引起原来的生成树成环,所以必定要擦去一条边,擦去的是哪一条边,这就利用到了次小生成树的原理了. 之前写过一个次小生成树的题,现在回过头看,感觉又有点不对了. 这里再总结一次: 首先肯定是构造一颗最小生成树,接下来就是枚举不在生成树里的边,假定为(u,

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+