当我理解明白题意时,内心几乎是崩溃的==
勇太有一张n个点m条边的无向图,每一条边的长度都是1。现在他想再在这张图上连上一条连接两个不同顶点边,使得1号点到n号点的最短路尽可能的短。现在他想要知道最短路最短是多少,以及再保证最短路最短的情况下,他有多少种连边的方案。
题解:看了提问才明白==最后的最短路一定是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; }