根据 GreyKa的提示菜菜对这题终于有点眉目了
这个图顺着以s为出发点跑一遍,逆着以t为出发点跑一边,然后再枚举传送门就可以得出最小啦!
非常非常丑陋的代码,感觉肯定可以优化……可能可以都用二维数组波,不用用分开存储d1,d2 还有图 这样叭
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef pair<int,int> P;
const int MAX=200005;
const long long INF=1e10;
struct edge
{
long long from,to,cost;//from是不必要的
edge(long long a,long long b,long long c)
{
from=a;
to=b;
cost=c;
}
};
vector<edge>G[MAX];
vector<edge>G2[MAX];
vector<pair<int,int> >C;
long long n,m;
long long d1[MAX];
long long d2[MAX];
void init()
{
fill(d1,d1+MAX,INF);
fill(d2,d2+MAX,INF);
for(int i=0; i<MAX; i++)G[i].clear();
C.clear();
}
void dijkstra(int s)
{
set<pair<int,int> >ss;
d1[s]=0;
ss.insert(make_pair(0,s));
while(ss.size()!=0)
{
set<pair<int,int> >::iterator it=ss.begin();
pair<int,int>P=*it;
ss.erase(it);
int v=P.second;
if(d1[v]<P.first)continue;
for(int i=0; i<G[v].size(); i++)
{
int k=G[v][i].to;
if(d1[k]>d1[v]+G[v][i].cost)
{
d1[k]=d1[v]+G[v][i].cost;
ss.insert(make_pair(d1[k],k));
}
}
}
}
void dijkstra2(int s)
{
set<pair<int,int> >ss;
d2[s]=0;
ss.insert(make_pair(0,s));
while(ss.size()!=0)
{
set<pair<int,int> >::iterator it=ss.begin();
pair<int,int>P=*it;
ss.erase(it);
int v=P.second;
if(d2[v]<P.first)continue;
for(int i=0; i<G2[v].size(); i++)
{
int k=G2[v][i].to;
if(d2[k]>d2[v]+G2[v][i].cost)
{
d2[k]=d2[v]+G2[v][i].cost;
ss.insert(make_pair(d2[k],k));
}
}
}
}
int main()
{
int T;
cin>>T;
int p,s,t;
cin>>n>>m>>p>>s>>t;
init();
long long a,b,c;
for(int i=0; i<m; i++)
{
cin>>a>>b>>c;
edge p1(a,b,c);
edge p2(b,a,c);
G2[b].push_back(p2);
G[a].push_back(p1);
}
for(int i=0;i<p;i++){
cin>>a>>b;
C.push_back(make_pair(a,b));
}
dijkstra(s);
dijkstra2(t);
long long minxx=d1[t];
for(int i=0; i<p; i++)
{
P pp=C[i];
int x=pp.first;
int y=pp.second;
if((long long)d1[x]+d2[y]<minxx){
minxx=min(d1[x]+d2[y],minxx);
}
}
if(minxx==INF)cout<<"inf"<<endl;
else cout<<minxx<<endl;
return 0;
}