1 条题解
-
0
C++ :
#include<cstdio> #include<queue> #include<cstring> using namespace std; queue<int> q; int rotb1[1001][1001],rotr1[1001][1001]; int rotb2[1001][1001],rotr2[1001][1001]; long long mi1[1002],mi2[1002]; bool d1[1001],d2[1001]; int main() { //freopen("party.in","r",stdin); //freopen("party.out","w",stdout); int n,m,k,a,b,r; long long maxx=0; scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=m;i++) { scanf("%d%d%d",&b,&a,&r); rotb1[a][++rotb1[a][0]]=b; rotr1[a][++rotr1[a][0]]=r; rotb2[b][++rotb2[b][0]]=a; rotr2[b][++rotr2[b][0]]=r; } memset(mi1,127,sizeof(mi1)); memset(mi2,127,sizeof(mi2)); mi1[k]=mi2[k]=0; q.push(k); while (!q.empty()) { int num=q.front(); q.pop(); d1[num]=false; for (int i=1;i<=rotb1[num][0];i++) { b=rotb1[num][i]; r=rotr1[num][i]; if (mi1[b]>mi1[num]+r) { mi1[b]=mi1[num]+r; if(!d1[b]) { q.push(b); d1[b]=true; } } } } q.push(k); while (!q.empty()) { int num=q.front(); q.pop(); d2[num]=false; for (int i=1;i<=rotb2[num][0];i++) { b=rotb2[num][i]; r=rotr2[num][i]; if (mi2[b]>mi2[num]+r) { mi2[b]=mi2[num]+r; if(!d2[b]) { q.push(b); d2[b]=true; } } } } for (int i=1;i<=n;i++) if(maxx<mi1[i]+mi2[i]&&mi1[i]!=mi1[1001]&&mi2[i]!=mi2[1001]) maxx=mi1[i]+mi2[i]; printf("%lld",maxx); return 0; }
- 1
信息
- ID
- 1455
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者