补过之后的做法: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;
vector o[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;
}