H. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛

补过之后的做法:dfs+拓扑序 找最长路
题目链接:https://nanti.jisuanke.com/t/16957

在这个寒假里,鲍伯有一个在山上滑雪的计划。
这个滑雪场有不同的滑雪道和N个不同的旗子。
点。
从四届国旗国旗的第i个路径长度李。
每个路径都必须遵循降高度原则,起始点必须是
严格高于终点。
一个可用的滑雪道将从一面旗帜开始,穿过几个旗帜沿着
路径,并以另一个标志结束。
现在,你应该帮鲍伯在滑雪场找到最长的滑雪道。

#include 
#include
#include
#include
#include
#include
using namespace std;
int vis[20000],dis[20000],in[20000];
typedef pair<int,int> pp;
vectoro[20000];
void dfs(int x)
{
    vis[x] = 1;
    for(int i=0;iint v  = u.first;
        int d = u.second;
        if(vis[v]==0)
        {
            dfs(v);
        }
        dis[x] = max(dis[x],dis[v]+d);
    }
}
int main()
{
    int t;
    cin>>t;

    while(t--)
    {

        memset(vis,0,sizeof(vis));
        memset(dis,0,sizeof(dis));
        memset(in,0,sizeof(in));
        int n,m;
        int u,v,p;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            o[i].clear();//初始化
        }
        for(int i=1;i<=m;i++ )
        {
            scanf("%d%d%d",&u,&v,&p);
            o[u].push_back(pp(v,p));
            in[v]++;
        }
        int ans= 0 ;
        for(int i=1;i<=n;i++)
        {
            if(in[i]==0)//找出起点,dfs
            {
                dfs(i);
            }
            ans = max(ans,dis[i]);

        }
        cout<return 0;
}

topsort
其实就是利用入度和出度的增减来代替标记数组
#include   
using namespace std;  
const int inf = 0x3f3f3f3f;  
const int maxn = 1e4+5;  
const int maxm = 1e5+5;  
struct node{int v, w, next;} edge[maxm];  
int no, head[maxn];  
int t, n, m;  
int deg[maxn], val[maxn];  
queue<int> q;  
void init()  
{  
    no = 0;  
    memset(head, -1, sizeof head);  
    memset(deg, 0, sizeof deg);  
    memset(val, 0, sizeof val);  
}  
inline void add(int u, int v, int w)  
{  
    edge[no].v = v; edge[no].w = w;  
    edge[no].next = head[u]; head[u] = no++;  
}  
void topsort()  
{  
    while(!q.empty()) q.pop();  
    for(int i = 1; i <= n; ++i)  
    if(!deg[i]) q.push(i);  
    int ans = 0;  
    while(!q.empty())  
    {  
        int u = q.front(); q.pop();  
        for(int k = head[u]; k+1; k = edge[k].next)  
        {  
            int v = edge[k].v;  
            val[v] = max(val[v], edge[k].w+val[u]);  
            if(--deg[v] == 0) q.push(v);  
        }  
    }  
    printf("%d\n", *max_element(val+1, val+n+1));  
}  
int main()  
{  
    for(scanf("%d", &t); t--;)  
    {  
        scanf("%d %d", &n, &m); init();  
        for(int i = 1; i <= m; ++i)  
        {  
            int u, v, w;  
            scanf("%d %d %d", &u, &v, &w);  
            add(u, v, w); ++deg[v];  
        }  
        topsort();  
    }  
    return 0;  
}  

题目还不能看,先贴代码过来:
code

#include 
#include
#include
#include
#include
#include
#include 
using namespace std;
struct node
{
    int e,h;
};
int t,n,m,x;
int a[10010];
vector b[10010];
struct node d;

int dfs(int y)
{
    int i,j,s;
    if(b[y].empty())
    {
        a[y]=0;
        return 0;
    }
    else if(a[y]!=-1)return a[y];
    j=b[y].size();
    for(i=0;ireturn a[y];
}

int main()
{
    int s;
    cin>>t;

    while(t--)
    {
        s=0;
        scanf("%d%d",&n,&m);
        memset(a,-1,sizeof(a));
        for(int i=1;i<=n;i++)b[i].clear();
        while(m--)
        {
            scanf("%d %d %d",&x,&d.e,&d.h);
            b[x].push_back(d);
        }
        for(int i=1; i<=n; i++)
        {
            s=max(s,dfs(i));
        }
       /* for(int i=1; i<=n; i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");*/
        printf("%d\n",s);
    }
    return 0;
}

你可能感兴趣的:(2017,ACM-ICPC,亚洲区,网络赛)