当我理解明白题意时,内心几乎是崩溃的==
勇太有一张nn个点mm条边的无向图,每一条边的长度都是1。现在他想再在这张图上连上一条连接两个不同顶点边,使得1号点到nn号点的最短路尽可能的短。现在他想要知道最短路最短是多少,以及再保证最短路最短的情况下,他有多少种连边的方案。
题解:看了提问才明白==最后的最短路一定是1,要是原来1和n没连上,只能连他俩 否则N个点中任意找两个连上即可 亏我还费劲找最短路模板和组合数求法==
#include <iostream>
#include<cstdio>
#include<cstring>
#define MaxN 110
#define MaxInt 65535
using namespace std;
int n,m;
bool A[102][102];
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
A[i][j]=A[j][i]=0;
}
int a,b;
while(m--)
{
scanf("%d%d",&a,&b);
A[b][a]=A[a][b]=1;
}
printf("1 ");
/* start=1;nd=n;
int tmp=dijkstra(),tmp1;
int mark=0;
int num[10000];
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(A[i][j]!=MAXINT)
{
A[i][j]=A[j][i]=1;
tmp1=dijkstra();
if(tmp1<tmp) num[++mark]=1,tmp=tmp1;
else if(tmp1==tmp) num[mark]++;
A[i][j]=A[j][i]=MAXINT;
}
}
}*/
if(!A[1][n]) printf("1\n");
else printf("%d\n",n*(n-1)/2);
}
return 0;
}