比赛 20120703 评测结果 AAAAAAAAAA
题目名称 旅行 最终得分 100
用户昵称 Satoshi 运行时间 0.046 s
代码语言 C++ 内存使用 0.36 MiB
提交时间 2016-02-21 08:40:05
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#define N 110
using namespace std;
ifstream in("travela.in");
ofstream out("travela.out");
int n,m,K;
int dfn[N]={0},low[N]={0};
int tim=0;
vector<int > G[N],C[N];
bool l[N]={0};
int f[N][N]={0};
int s[N]={0},cnt=0;
int color[N]={0};
int INF=(1<<28);
void tarjan(int u)
{
	int i,v;
	dfn[u]=low[u]=++tim;
	l[u]=1;
	s[++s[0]]=u;
	for(i=0;i<G[u].size();i++)
	{
		v=G[u][i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(l[v])low[u]=min(low[u],dfn[v]);
		
	}
	if(dfn[u]==low[u])
	{
		cnt++;
		do
		{
			v=s[s[0]];
			l[v]=0;
		    color[v]=cnt;
			s[0]--;
		}while(u!=v);
	}
}
void SPFA(int s)
{
	int i,j,u,v,w,temp;
	queue<int> q;
	for(i=1;i<=n;i++)
	{
		l[i]=0;
		for(j=0;j<=100;j++)
		{
			f[j][i]=INF;
		}
	}
	for(j=0;j<=K;j++)f[j][s]=0;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		l[u]=0;
		for(i=0;i<G[u].size();i++)
		{
			v=G[u][i];
			w=C[u][i];
			if(color[u]!=color[v])
			{
				w=w<<1;
			    for(j=0;j<=K;j++)
			    {
				    temp=f[j][u]+w;
				    if(f[j+1][v]>temp)
				    {
					    f[j+1][v]=temp;
					    if(!l[v])
					    {
						    l[v]=1;
						    q.push(v);
					    }
				    }
			    }
			}
			else
			{
				for(j=0;j<=K;j++)
			    {
				    temp=f[j][u]+w;
				    if(f[j][v]>temp)
				    {
					    f[j][v]=temp;
					    if(!l[v])
					    {
						    l[v]=1;
						    q.push(v);
					    }
				    }
			    }
			}
		}
	}
}
void work()
{
	int i,ans=INF;
	SPFA(1);
	for(i=0;i<=K;i++)ans=min(ans,f[i][n]);
	//for(i=1;i<=n;i++)out<<color[i]<<endl;
	if(ans!=INF)out<<ans<<endl;
	else out<<-1<<endl;
}
void read()
{
	int i,u,v,w;
	in>>n>>m>>K;
	for(i=1;i<=m;i++)
	{
		in>>u>>v>>w;
		u++;v++;
		G[u].push_back(v);
		C[u].push_back(w);
	}
	for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);
}
void clear()
{
	int i,j;
	for(i=1;i<=100;i++)
	{
		G[i].clear();
		C[i].clear();
		for(j=0;j<=15;j++)
		{
			f[j][i]=0;
		}
		l[i]=0;
		dfn[i]=low[i]=0;
		tim=cnt=0;
		color[i]=0;
	}
}
int main()
{
	while(true)
	{
		
		clear();
	    read();
		if(!n)break;
	    work();
	}
	
	return 0;
}