题目大意&&思路:求出最小环,模板撸过~~~(floyd在求出最短路径的同时把最小环也求出来)
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define inf 1000000000
int mm[105][105];
int dd[105][105];
int n,m;
int circle;
void froyd()
{
for(int i=1;i<=n;i++)
{
for(int k=1;k<i;k++)
{
for(int g=k+1;g<i;g++)
{
if(mm[k][g]!=inf&&dd[g][i]!=inf&&dd[i][k]!=inf&&mm[k][g]+dd[g][i]+dd[i][k]<circle)
{
circle=min(mm[k][g]+dd[g][i]+dd[i][k],circle);///
//cout<<mm[k][g]<<endl;
//cout<<k<<" "<<g<<" "<<i<<endl;
}
}
}
for(int k=1;k<=n;k++)
{
for(int g=1;g<=n;g++)
{
//cout<<"k i g "<<k<<" "<<i<<" "<<g<<endl<<endl;;
//cout<<"mm[k][g]=mm[k][i]+mm[i][g] "<<mm[k][g]<<" "<<mm[k][i]<<" "<<mm[i][g]<<endl;
if(mm[k][g]>mm[k][i]+mm[i][g])
mm[k][g]=mm[k][i]+mm[i][g];
}
}
}
//cout<<mm[1][2]<<endl;
//cout<<mm[2][3]<<endl;
//cout<<mm[1][3]<<endl;
}
int main()
{
while(cin>>n>>m)
{
int aa,bb,w;
for(int i=1;i<=n;i++)
for(int g=1;g<=n;g++)
{ mm[i][g]=inf; dd[i][g]=inf;}
for(int i=1;i<=m;i++)
{
cin>>aa>>bb>>w;
if(w<mm[aa][bb]) //没这个条件会WA掉
{
mm[aa][bb]=w;
mm[bb][aa]=w;
dd[aa][bb]=w;
dd[bb][aa]=w;
}
} //for(int i=1;i<=n;i++)
// for(int g=1;g //{cout<<mm[i][g]<<' ';if(g==n)cout<<endl;}
circle=inf;
froyd();
if(circle==inf)
cout<<"It's impossible."<<endl;
else
cout<<circle<<endl;
}
return 0;}