UVALive 7456 Least Crucial Node
2016-08-17 18:41
363 查看
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5478
题意:有n个点,m条边,给出点S(1~n中的某个点)。除了S点之外的n-1个点中的一个如果失效,那么可能会影响到若干个点和S的连通性。现在要找一个点p,使得p失效后使得点和S不连通的数量最大,在此基础上p的标号越小。
思路:枚举失效n-1个点,每次做一遍并查集,检查有多少点会失效。然后取最大值即可。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;
#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)
#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007
#define mp make_pair
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m=(l+r)>>1
const int maxn = 110;
int n,m,st;
int x[maxn*maxn];
int y[maxn*maxn];
int k[maxn];
int father[maxn];
int getfather(int x)
{
return x==father[x]?x:father[x] = getfather(father[x]);
}
void init()
{
scanf("%d",&st);
scanf("%d",&m);
rep(i,1,m) scanf("%d%d",&x[i],&y[i]);
Clean(k,0);
}
void unio( int a , int b )
{
int fa = getfather(a);
int fb = getfather(b);
if ( fa != fb )
{
father[fa] = fb;
}
}
void solve()
{
rep(i,1,n)
{
if ( i == st ) continue;
rep(j,1,n) father[j] = j;
rep(j,1,m)
if ( x[j] != i && y[j] != i )
unio( x[j] , y[j] );
rep(j,1,n)
if ( j != i && getfather(j) != getfather(st) ) k[i]++;
}
int ans,M = 0;
rep(i,1,n)
if ( k[i] > M )
{
M = k[i];
ans = i;
}
printf("%d\n",ans);
}
int main()
{
while( scanf("%d",&n) == 1 )
{
if ( !n ) break;
init();
solve();
}
return 0;
}
题意:有n个点,m条边,给出点S(1~n中的某个点)。除了S点之外的n-1个点中的一个如果失效,那么可能会影响到若干个点和S的连通性。现在要找一个点p,使得p失效后使得点和S不连通的数量最大,在此基础上p的标号越小。
思路:枚举失效n-1个点,每次做一遍并查集,检查有多少点会失效。然后取最大值即可。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;
#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)
#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007
#define mp make_pair
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m=(l+r)>>1
const int maxn = 110;
int n,m,st;
int x[maxn*maxn];
int y[maxn*maxn];
int k[maxn];
int father[maxn];
int getfather(int x)
{
return x==father[x]?x:father[x] = getfather(father[x]);
}
void init()
{
scanf("%d",&st);
scanf("%d",&m);
rep(i,1,m) scanf("%d%d",&x[i],&y[i]);
Clean(k,0);
}
void unio( int a , int b )
{
int fa = getfather(a);
int fb = getfather(b);
if ( fa != fb )
{
father[fa] = fb;
}
}
void solve()
{
rep(i,1,n)
{
if ( i == st ) continue;
rep(j,1,n) father[j] = j;
rep(j,1,m)
if ( x[j] != i && y[j] != i )
unio( x[j] , y[j] );
rep(j,1,n)
if ( j != i && getfather(j) != getfather(st) ) k[i]++;
}
int ans,M = 0;
rep(i,1,n)
if ( k[i] > M )
{
M = k[i];
ans = i;
}
printf("%d\n",ans);
}
int main()
{
while( scanf("%d",&n) == 1 )
{
if ( !n ) break;
init();
solve();
}
return 0;
}
相关文章推荐
- ZooKeeper web管理安装node-zk-browser
- Hadoop2动态调整Log级别-以datanode的heartbeat log为例
- Hadoop2动态调整Log级别-以datanode的heartbeat log为例
- node.js学习笔记目录
- NodeJs系列二:你好,世界
- find distance between two nodes in a binary tree
- node -- 使用UEditor富文本编辑器
- Nodejs学习总结 -Express入门(一)
- nw.js node-webkit系列(25)child_process中spawn和exec方法的使用
- 382. Linked List Random Node
- LeetCode - Linked List Random Node
- Nodewebkit 设置任务栏图标
- LeetCode-Linked List Random Node
- WRTnode 2Q 按键驱动说明
- Nodewebkit debug调试模式
- LinkNode
- Node.js中使用jQuery的做法
- 使用pm2管理node进程
- 382. Linked List Random Node
- nodejs死亡笔记之cookie和session(宇宙级框架express)