LightOJ-1049-图论

来源:互联网 发布:原生js设置transform 编辑:程序博客网 时间:2024/05/16 06:51

题目大意:给定一张有向图有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;}



0 0