比赛 20120703 评测结果 AWWWWWAWWW
题目名称 旅行 最终得分 20
用户昵称 TBK 运行时间 0.018 s
代码语言 C++ 内存使用 87.16 MiB
提交时间 2012-07-03 11:00:28
显示代码纯文本
#include <iostream> 
#include <cmath> 
#include <cstring> 
#include <string> 
#include <cstdio> 
#include <cstdlib> 
#include <iomanip> 
#include <set> 
#include <algorithm> 
#define MAXN 0x7fffffff 
using namespace std; 
int a[1001][1001][2],b,c,d,l,m=1,m1,m2,m3,n[1001],r[1001],s,k[1001][2],z[1001][12],h=1,t,p[10000000][2];
void DFS(int x)
{
    int y;
    r[x]=1;
    k[x][0]=m;
    k[x][1]=m;
    m++;
    n[m3]=x;
    m3++;
    for (y=0;y<b;y++)
    {
        if (a[x][y][0]==0) continue;
        if (k[y][0]==0) 
        {
            DFS(y);
            if (k[y][1]<k[x][1]) k[x][1]=k[y][1];
        }
            else if (r[y]==1) k[x][1]=k[y][0]<k[x][1]?k[y][0]:k[x][1]; 
    }
    if (k[x][0]==k[x][1])
    {
        int i;
        i=n[m3-1];
        while (i!=x)
        {
            r[i]=0;
            m3--;
			a[i][n[m3-1]][1]++;
			a[n[m3-1]][i][1]++;
            i=n[m3-1];
        }
        m3--;
        r[x]=0;
    }
}
void SPFA(void)
{
	bool bo[101][11]={false};
	int i,j;
	while (h>t)
    {
        bo[p[t][0]][p[t][1]]=false;
        for (i=0;i<b;i++)
			for (j=0;j<=d;j++)
				if (p[t][0]!=i)
				{
					if ((a[p[t][0]][i][1]==1)&&(z[p[t][0]][j]<z[i][j]-a[p[t][0]][i][0]))
					{
						if (a[p[t][0]][i][0]!=0) 
						{
							z[i][j]=z[p[t][0]][j]+a[p[t][0]][i][0];
							if (bo[i][j]==false) 
							{
								bo[i][j]=true;
								p[h][0]=i;
								p[h][1]=j;
								h++;
							}
						}
					}
					if ((a[p[t][0]][i][1]==0)&&(z[p[t][0]][j]<z[i][j+1]-a[p[t][0]][i][0]*2))
					{
						if (a[p[t][0]][i][0]!=0)
						{
							z[i][j+1]=z[p[t][0]][j]+a[p[t][0]][i][0]*2;
							if (bo[i][j]==false) 
							{
								bo[i][j]=true;
								p[h][0]=i;
								p[h][1]=j;
								h++;
							}
						}
					}
				}
        t++;
    }
}
int main(void) 
{    
    freopen("travela.in","r",stdin); 
    freopen("travela.out","w",stdout); 
	scanf("%d%d%d",&b,&c,&d);
	for (l=0;l<c;l++)
	{
		scanf("%d%d",&m1,&m2);
		scanf("%d",&s);
		if (a[m1][m2][0]==0) a[m1][m2][0]=s;
			else if (s<a[m1][m2][0]) a[m1][m2][0]=s;
	}
	for (l=0;l<b;l++)
		if (r[l]==0) DFS(l);
	for (l=0;l<b;l++)
		for (m1=0;m1<=d;m1++)
			z[l][m1]=MAXN;
	z[0][0]=0;
	SPFA();
	s=MAXN;
	for (l=0;l<=d;l++)
		if (z[b-1][l]<s) s=z[b-1][l];
	if (s==MAXN) printf("-1");
		else printf("%d",s);
	fclose(stdin); 
    fclose(stdout); 
    return 0; 
}