Problem G
没做过这样的题目完全没思路
Problem Description
给定n个点,m条无向边,1为起点,求从起点出发,至少经过两个点(非起点)并且回到最终回到起点的最短路(中途可以经过起点)
点的编号为1到n
点的编号为1到n
Input
多组用例
每个用例的第一行是2个整数n和m(2<=n <= 100, m <= 1000)
接下来的m行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,长度为c(0<c <= 100)
每个用例的第一行是2个整数n和m(2<=n <= 100, m <= 1000)
接下来的m行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,长度为c(0<c <= 100)
Output
对于每个用例,输出最短路的长度,如果不存在最短路,输出-1
Sample Input
3 3 1 2 1 2 3 1 3 1 1
Sample Output
3 没做过这样的题目完全没思路#include<stdio.h> #include<string> using namespace std; const int inf=1<<29; int n, m; int a[105][105]; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=inf; for(int i =1;i<=m;++i) { int x,y,z; scanf("%d%d%d",&x,&y,&z); a[x][y]=min(a[x][y],z); a[y][x]=min(a[y][x],z); } for(int k=1;k<=n;++k) { for (int i=1;i<=n;++i) { for (int j=1;j<=n;++j) { a[i][j]=min(a[i][j],a[i][k] + a[k][j]); } } } int ans=inf; for(int i=2;i<=n;++i) { for (int j=i+1;j<=n;++j) { ans=min(ans,a[1][i]+a[i][j]+a[j][1]); } } if (ans==inf)ans=-1; printf("%d\n", ans); } return 0; }
没做过这样的题目完全没思路