Rikka with Graph
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 232 Accepted Submission(s): 124
Yuta has a non-direct graph with n vertices and m edges. The length of each edge is 1. Now he wants to add exactly an edge which connects two different vertices and minimize the length of the shortest path between vertice 1 and vertice n. Now he wants to know the minimal length of the shortest path and the number of the ways of adding this edge.
It is too difficult for Rikka. Can you help her?
For each testcase, the first line contains two numbers n,m(2≤n≤100,0≤m≤100).
Then m lines follow. Each line contains two numbers u,v(1≤u,v≤n) , which means there is an edge between u and v. There may be multiedges and self loops.
2 1 1 2
1 1HintYou can only add an edge between 1 and 2.
如果1-n已经连接了,那么最短路是1,随便连一条边即可,方案数为n * (n - 1) / 2。
如果1-n还没有连接,那么要保证最短只能连接1-n,方案数为1。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 105;
const int INF = 0x3f3f3f3f;
int n, m, map[MAXN][MAXN];
void floyd()
{
for(int k = 1; k <= n; ++k)
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(map[i][k] + map[k][j] < map[i][j])
map[i][j] = map[i][k] + map[k][j];
}
int main(int argc, char const *argv[])
{
while(scanf("%d%d", &n, &m) != EOF) {
memset(map, INF, sizeof(map));
for(int i = 0; i <= n; ++i)
map[i][i] = 1;
for(int i = 0; i < m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
map[x][y] = map[y][x] = 1;
}
floyd();
if(map[1][n] == 1) printf("1 %d\n", n * (n - 1) / 2);
else printf("1 1\n");
}
return 0;
}
3647



被折叠的 条评论
为什么被折叠?



