拓扑+临接表求助
  • 板块P1807 最长路
  • 楼主tuboshu666
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/18 19:21
  • 上次更新2024/11/18 21:29:34
查看原帖
拓扑+临接表求助
1438864
tuboshu666楼主2024/11/18 19:21
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

struct node
{
    int v;
    int w;
};

const int N = 1510;
vector<node> vec[N];
long long f[N];
int din[N]; 
queue<int> q;

void add(int u1 , int v1 , int w1)
{
    vec[u1].push_back({v1,w1});
}

int main()
{
    memset(f,128,sizeof(f)); //初始化极小值 
    int n,m;
    cin >> n >> m;
    for (int i = 1 ; i <= m ; i++)
    {
        int u2,v2,w2;
        cin >> u2 >> v2 >> w2;
        
        if (vec[u2].size() == 0)
		{
			add(u2,v2,w2);
		}
		else
		{
			for (int i = 0 ; i < vec[u2].size() ; i++) //有重复边取最大边权 
			{
				if (vec[u2][i].v == v2)
				{
					vec[u2][i].w = max(vec[u2][i].w , w2);
					break;
				}
			}
			
			add(u2,v2,w2);
		}  
    }
    
    q.push(1);
    f[1] = 0;
    
    while (!q.empty()) //找到1能延伸到的点,只有这些点计算入度 
    {
        int t = q.front();
        q.pop();
        
        for (int i = 0 ; i < vec[t].size() ; i++)
        {
            int d = vec[t][i].v;
            q.push(d);
            din[d]++;
        }
    }    
    
    q.push(1);
    
    while (!q.empty()) //动态规划 
    {
        int t = q.front();
        q.pop();
        
        for (int i = 0 ; i < vec[t].size() ; i++)
        {
            if (f[vec[t][i].v] < -2e10)
            {
                f[vec[t][i].v] = f[t] + vec[t][i].w;
            }
            else
            {
                f[vec[t][i].v] = max(f[vec[t][i].v] , f[t] + vec[t][i].w);
            }
            
            din[vec[t][i].v]--;
            
            if (din[vec[t][i].v] == 0) //入度为0入队 
            {
                q.push(vec[t][i].v);
            }
        }
    }
    
    if (f[n] < -2e10) //不可达 
    {
        cout << -1 << endl;
    }
    else
    {
        cout << f[n] << endl;
    }
    
    return 0;
}

WA+MLE,救救孩子

2024/11/18 19:21
加载中...