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; }菜鸟成长记