/*
题意:就是求最短路了~~~。
思路:根据题意建好图,然后跑一次最短路,求出硬座的最少的花费,如果到不了,则卧铺肯定也到不了。直接输出-1;
否则再求卧铺的最短路,然后比较两个哪个小,输出小的即可。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define INF 999999999
#define MAX 210
struct edge
{
int from,to,flag;
};
vector<edge>edges;
vector<int>G[MAX];
int dis[MAX];
int n,m;
char a[10010];
int vis[MAX];
int rw,yw;
int zx,zy;
int dijst()
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
}
dis[zx]=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
int min=INF,u;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&min>dis[i])
{
min=dis[i];
u=i;
}
}
if(min==INF) break ;
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
int v=edges[G[u][i]].to;
if(dis[u]+yw<dis[v])
{
dis[v]=dis[u]+yw;
}
}
}
if(dis[zy]==INF) return -1;
else return dis[zy];
}
int dijst2()
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
}
dis[zx]=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
int min=INF,u;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&min>dis[i])
{
min=dis[i];
u=i;
}
}
if(min==INF) break ;
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
int v=edges[G[u][i]].to;
if(!edges[G[u][i]].flag) continue ;
if(dis[u]+rw<dis[v])
{
dis[v]=dis[u]+rw;
}
}
}
return dis[zy];
}
void addedge(int x,int y,int flag)
{
edge v={x,y,flag};
edges.push_back(v);
G[x].push_back(edges.size()-1);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
G[i].clear();
}
edges.clear();
for(int i=1;i<=m;i++)
{ int flag;
scanf("%s",a);
scanf("%d",&flag);
int len=strlen(a);
int sum=0,sum1=0;
for(int i=0;i<len;i++)
{ sum1=sum;
sum=0;
int j=i;
for(;a[j]!='+'&&j<len;j++)
{
sum=sum*10+a[j]-'0';
}
if(sum1!=0)
{
addedge(sum1,sum,flag);
}
i=j;
//printf("%d ",sum);
}
// printf("\n");
}
scanf("%d%d",&yw,&rw);
scanf("%d%d",&zx,&zy);
int ans1,ans2;
ans1=dijst();
if(ans1==-1) {printf("-1\n"); continue;}
ans2=dijst2();
if(ans1<ans2) printf("%d\n",ans1);
else printf("%d\n",ans2);
}
}
hdu 4552 湫湫系列故事——过年回家 腾讯马拉松~~~~
最新推荐文章于 2017-08-23 21:04:55 发布