题目大意:给定一张有向图有n个节点,有n条边,任意一个点都有两条邻边,每次可以使一条边方向改变,问要使得任意两点都有路径最少花费是多少;
题目解析:首先我们看n条边,n个点,且每个点有两条邻边,那么肯定是一个环,所以答案只有两种可能,一种是顺时针方向,另一种就是把其方向反向一边,就是把总花费减去前面那个即可;
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<map>
using namespace std;
int a[101][3],cost[101][101];
int m[101];
int main()
{
int cas,c,i,n,u,v,w,x,y,ans;
scanf("%d",&cas);
for(c=1;c<=cas;c++)
{
memset(a,-1,sizeof(a));
memset(cost,0,sizeof(cost));
ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(a[u][1]==-1)
a[u][1]=v;
else
a[u][2]=v;
if(a[v][1]==-1)
a[v][1]=u;
else
a[v][2]=u;
cost[v][u]=w;
ans+=w;
}
memset(m,0,sizeof(m));
int sum=cost[1][a[1][1]]+cost[a[1][2]][1];
x=1,y=a[1][1];
m[y]++;
m[x]++;
for(i=1;i<=n-2;i++)
{
if(m[a[y][1]]==0)
{
x=y;
y=a[y][1];
m[y]++;
sum+=cost[x][y];
}
else
{
x=y;
y=a[y][2];
m[y]++;
sum+=cost[x][y];
}
}
printf("Case %d: %d\n",c,min(sum,ans-sum));
}
return 0;
}