如题,用了
if(dis[t]<tmp.first)continue;
优化,但还是过不了1,6两个点。
#include<bits/stdc++.h>
#define P pair<int,int>
#define inf 1000000000
using namespace std;
int n,m,s;
int u,v,w;
vector<P>g[100001];
int dis[100001];
//bool used[100001];
priority_queue<P>a;
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d%d",&n,&m,&s);
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&u,&v,&w);
g[u].push_back(make_pair(w,v));
}
for(int i=1; i<=n; i++)
dis[i]=inf;
dis[s]=0;
a.push(make_pair(0,s));
while(!a.empty())
{
P tmp=a.top();
a.pop();
int t=tmp.second;
// cout<<tmp.first<<" "<<tmp.second<<endl;
if(dis[t]<tmp.first)//已经松弛过
continue;
for(int j=0; j<g[t].size(); j++)
{
P t1=g[t][j];
if(dis[t1.second]>dis[t]+t1.first)
{
dis[t1.second]=dis[t]+t1.first;
a.push(make_pair(dis[t1.second],t1.second));
}
}
}
for(int i=1; i<=n; i++)
printf("%d ",dis[i]);
return 0;
}