2 1 1 2
1 1HintYou can only add an edge between 1 and 2.
/************************************************************************/
附上该题对应的中文题
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的: 勇太有一张n个点m条边的无向图,每一条边的长度都是1。现在他想再在这张图上连上一条连接两个不同顶点边,使得1号点到n号点的最短路尽可能的短。现在他想要知道最短路最短是多少,以及再保证最短路最短的情况下,他有多少种连边的方案。 当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
数据组数不超过100组。每组数据的第一行两个整数n,m(2≤n≤100,0≤m≤100)。 接下来m行。每行两个整数u,v(1≤u,v≤n),代表原图中的一条无向边。注意可能有自环和重边。
对于每一组数据输出一行两个整数:最短路最短是多少以及加边的方案数。
2 1 1 2
1 1
你只能连上1 2这条边。
出题人的解题思路:
如果连上1-n的边,最短距离就是1。所以所有情况下最短距离都是1。
考虑方案数,如果本来没有1-n的边,那么只能连1-n,方案数为1。否则怎么连都可以,方案数是2n(n−1)。
那么,情况无非两种:
①本身没有结点1到结点n的边,那么我们只有一种方案可以使最短路为1,即添上一条结点1到结点n的边
②本身已经存在结点1到结点n的边,也就是说已经存在最短路,那么我们便可以添加任意两个结点之间的边,这样的话,按照完全图的定义,方案数为n*(n-1)/2
如图,n=6时,此时1~6的路径长度是3,即1->2->5->6,为了使路径最短,我们只需添上一条1->6的边,这样最短路就变成了1,而且只有这么一种添加方案
但是,如果原先就已经存在这条1->6的边,那么已经达到最短路,那我就可以随便添加1条边,这对最短路是没有任何影响的
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 7061;
const int inf = 2147483647;
const int mod = 2009;
int main()
{
int n,m,i,a,b;
bool flag;
while(~scanf("%d%d",&n,&m))
{
flag=false;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
if(a==1&&b==n||a==n&&b==1)
flag=true;
}
if(flag)
printf("1 %d\n",n*(n-1)/2);
else
puts("1 1");
}
return 0;
}
菜鸟成长记