@Alpacadh
2022-09-12T22:43:00.000000Z
字数 3392
阅读 770
ACM
#include<bits/stdc++.h>
//#include<iostream>
//#include<algorithm>
//#include<cmath>
//#include<cstring>
//#include<stdio.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e3+5;
const double eps=1e-4;
int g[N][N];
int d[N];
int va[N];
int val[N][N];
int vis[N];
//int pre[N];
void dijkstra(int s, int n)
{
memset(d,inf,sizeof(d));
memset(vis,0,sizeof(vis));
memset(va,inf,sizeof(va));
d[s]=0;
va[s]=0;
// pre[s]=0;
while(1)
{
int v=-1;
for(int u=1;u<=n;u++)
{
if(!vis[u]&&(v==-1||d[u]<d[v]))
v=u;
}
if(v==-1)
break;
vis[v]=1;
for(int u=1;u<=n;u++)
{
if(!vis[u]&&d[u]>d[v]+g[v][u])
{
d[u]=d[v]+g[v][u];
va[u]=va[v]+val[v][u];
// pre[u]=v; // 记录路径
}
else if(!vis[u]&&d[u]==d[v]+g[v][u])
va[u]=min(va[u],va[v]+val[v][u]);
}
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
memset(g,inf,sizeof(g));
memset(val,inf,sizeof(val));
for(int i=0;i<m;i++)
{
int u,v,a,b;
scanf("%d%d%d%d",&u,&v,&a,&b);
if(g[u][v]>a)
{
g[u][v]=g[v][u]=a;
val[u][v]=val[v][u]=b;
}
else if(g[u][v]==a)
val[u][v]=val[v][u]=min(val[u][v],b);
}
int s,t;
scanf("%d%d",&s,&t);
dijkstra(s,n);
printf("%d %d\n",d[t],va[t]);
}
return 0;
}
#include<bits/stdc++.h>
//#include<iostream>
//#include<algorithm>
//#include<cmath>
//#include<cstring>
//#include<stdio.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e3+5;
const double eps=1e-4;
int g[N][N];
int d[N];
int vis[N];
//int pre[N];
void dijkstra(int s, int n)
{
memset(d,inf,sizeof(d));
memset(vis,0,sizeof(vis));
d[s]=0;
// pre[s]=0;
while(1)
{
int v=-1;
for(int u=0;u<=n;u++)
{
if(!vis[u]&&(v==-1||d[u]<d[v]))
v=u;
}
if(v==-1)
break;
vis[v]=1;
for(int u=0;u<=n;u++)
{
if(!vis[u]&&d[u]>d[v]+g[v][u])
{
d[u]=d[v]+g[v][u];
// pre[u]=v; // 记录路径
}
}
}
}
int main()
{
int t,n,m;
while(~scanf("%d%d%d",&t,&n,&m))
{
int len=0;
memset(g,inf,sizeof(g));
for(int i=0;i<t;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
len=max(len,max(a,b));
g[a][b]=g[b][a]=min(g[a][b],c);
}
for(int i=0;i<=len;i++)
g[i][i]=0;
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
g[0][a]=g[a][0]=0;
}
dijkstra(0,len);
int ans=inf;
for(int i=0;i<m;i++)
{
int a;
scanf("%d",&a);
ans=min(ans,d[a]);
}
printf("%d\n",ans);
}
return 0;
}
#include<bits/stdc++.h>
//#include<iostream>
//#include<algorithm>
//#include<cmath>
//#include<cstring>
//#include<stdio.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e2+5;
const double eps=1e-4;
int g[N][N];
int d[N];
int vis[N];
//int pre[N];
void dijkstra(int s, int n)
{
memset(d,inf,sizeof(d));
memset(vis,0,sizeof(vis));
d[s]=0;
// pre[s]=0;
while(1)
{
int v=-1;
for(int u=1;u<=n;u++)
{
if(!vis[u]&&(v==-1||d[u]<d[v]))
v=u;
}
if(v==-1)
break;
vis[v]=1;
for(int u=1;u<=n;u++)
{
if(!vis[u]&&d[u]>d[v]+g[v][u])
{
d[u]=d[v]+g[v][u];
// pre[u]=v; // 记录路径
}
}
}
}
map<string,int>q;
int main()
{
int t;
while(~scanf("%d",&t))
{
if(t==-1)
break;
q.clear();
memset(g,inf,sizeof(g));
int k=0;
string s,tt;
cin>>s>>tt;
q[s]=++k;
if(s!=tt)
q[tt]=++k;
for(int i=0;i<t;i++)
{
string a,b;
int time;
cin>>a>>b;
if(q[a]==0)
q[a]=++k;
if(q[b]==0)
q[b]=++k;
scanf("%d",&time);
g[q[a]][q[b]]=g[q[b]][q[a]]=time;
}
dijkstra(1,k);
printf("%d\n",d[q[tt]]==inf?-1:d[q[tt]]);
}
return 0;
}