社区讨论

求助

P1462通往奥格瑞玛的道路参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi7y1men
此快照首次捕获于
2025/11/21 05:28
4 个月前
此快照最后确认于
2025/11/21 05:28
4 个月前
查看原帖
C
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#define int long long
using namespace std;
int n,m,b;
const int N=50000+5;
int a[N];
bool kill[N];
bool done[N];
int dis[N];
vector < pair < int ,int > > va[N*2+500];
void chushi(int limt)
{
    for(int i=1;i<=n;i++)
    kill[i]=0;
    for(int i=1;i<=n;i++)
    done[i]=0;
    for(int i=1;i<=n;i++)
    dis[i]=1e8;
    for(int i=2;i<=n;i++)
    if(a[i]>limt)
    kill[i]=1;
}
bool SPFA(int limt)
{	
    if(limt<a[1])
    return 0;
    queue<int>v;
    chushi(limt);
    dis[1]=0;
    v.push(1);
    done[1]=1;
    while(v.size())
    {
        int front=v.front();
        v.pop();
        done[front]=0;
        for(int i=0;i<va[front].size();i++)
        {
            int  to=va[front][i].first;
            int dist=va[front][i].second;
           if(kill[to])
            continue;
            if(dis[to]>dis[front]+dist)
            {
            	dis[to]=dis[front]+dist;
            	if(!done[to]) v.push(to); 
            }
        }
    }
    if(dis[n]>b)
    return 0;
    else
    return 1;
}
signed main()
{
    cin>>n>>m>>b;
    for(int i=1;i<=n;i++)
    cin>>a[i];
      for(int i=1;i<=m;i++)
    {
       int x,y,z;
       cin>>x>>y>>z;
       if(x==y)
       continue;
        va[x].push_back( make_pair (z,y));
        va[y].push_back( make_pair (z,x));
    }
 	int L=0,R=1000000000;
 	//cout<<SPFA(1000000000);
 	if(!SPFA(R))
 	{
 		cout<<"AFK";
 		return 0;
 	}
 	while(L<=R)
 	{
		int mid=(L+R)/2;
 		if(SPFA(mid))
 		R=mid-1;
 		else
 		L=mid+1;
 	}
 	cout<<L;
}
RE不懂

回复

5 条回复,欢迎继续交流。

正在加载回复...