[Coupe Blue Bridge] [2013 quatrième Zhenti] facteur de risque (violence + DSF)

Titre Description
Description du problème de la
guerre anti-japonaise, plaine Jizhong de la guerre du tunnel a joué un rôle important.
Authentique entre plusieurs sites avec un canal reliés pour former un grand réseau. Mais il y a des risques, quand l'ennemi a trouvé un site, entre autres sites peuvent donc être perdu le contact.
Nous définissons un facteur de risque DF (x, y):
Pour deux sites x et y (x = y!), Si vous pouvez trouver un z site, z est détruit quand l'ennemi, x et y en a pas, alors nous disons z est le point essentiel à propos de x, y a. En conséquence, pour toute paire de sites x et y, le facteur de risque DF (x, y) représente le nombre de points clés sur ces deux points est comprise entre.
La tâche de cette question est la suivante : Compte tenu de la structure du réseau, recherche coefficient de risque entre les deux sites.
Entrée des
données d'entrée de la première ligne contient deux entiers n (2 <= n <= 1.000), m (0 <= m <= 2000), qui représente le nombre de sites, le nombre de canaux, les
lignes suivantes m de deux nombres entiers u, v (1 <= u , v <= n; u = v!) représentatif d'un canal,
dernière ligne, deux nombres u, v, représentatif du facteur de risque d'interrogation DF (u, v) entre deux points.
Sortie
un nombre entier, si la requête ne sont pas en communication de deux sorties -1.
Entrée d' échantillon
. 7. 6
. 3 1.
2. 3
. 3. 4
. 3. 5
. 4. 5
. 5. 6
. 6 1.
sortie échantillon
2
Idées: Trouver le point de coupure entre les deux points, emmmm ont commencé à penser à un graphique cherche un point de coupure, mais il semble pas beaucoup d' importance. La quantité de données de 1000, nous établirons chaque point de coupe de point, voir si vous pouvez venir à v u de. Une telle complexité est O (n ^ 2) le temps ne sera pas expirer. Tous les chemins de recherche en ligne profonde + revenir en arrière, recherchez u-> chefs v avec la complexité du temps devrait être.
Code est la suivante:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=2e3+100;
struct edge{
	int to,next;
}e[maxx<<1];
int head[maxx<<1],vis[maxx];
int n,m,tot;
int u,v;

inline void init()
{
	memset(head,-1,sizeof(head));
	tot=0;
}

inline void add(int u,int v)
{
	e[tot].next=head[u],e[tot].to=v,head[u]=tot++;
}
inline void dfs(int u)
{
	vis[u]=1;
	if(u==v) return ;//一个小小的剪枝
	for(int i=head[u];i!=-1;i=e[i].next)
	{
		int to=e[i].to;
		if(vis[to]) continue;
		dfs(to);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	init();
	int x,y;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	scanf("%d%d",&u,&v);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(i==u||i==v) continue;
		for(int j=1;j<=n;j++) vis[j]=0;
		vis[i]=1;
		dfs(u);
		if(vis[v]==0) ans++;
	}
	printf("%d\n",ans);
	return 0;
}

Pour faire le plein d' un ah, ( O ) / ~

Publié 598 articles originaux · louange gagné 49 · vues 40000 +

Je suppose que tu aimes

Origine blog.csdn.net/starlet_kiss/article/details/105219331
conseillé
Classement