比赛 |
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;
}