1. 程式人生 > >K.MIKU醬的氪金寶典 (最短路變形||dfs+剪枝)

K.MIKU醬的氪金寶典 (最短路變形||dfs+剪枝)

https://ac.nowcoder.com/acm/contest/221/K

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#define INF 0x3f3f3f3f
#define LL long long 
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+5;
struct Edge
{
	int next;
	int to;
	int w;
}edge[maxn];
struct node
{
	int num;
	int dist;
	node(int x,int y)
	{
		num=x;
		dist=y;
	}
	friend bool operator<(node a,node b)
	{
		return a.dist>b.dist;
	}
};
int head[maxn];
int n,m,cnt;
int dis[maxn];
bool vis[maxn];
void add(int u,int v,int w)
{
	edge[cnt].next=head[u];
	edge[cnt].to=v;
	edge[cnt].w=w;
	head[u]=cnt++;
}
void dij(int x)
{
	priority_queue<node>que;
	memset(dis,0x3f,sizeof(dis));
	dis[x]=0;
	que.push(node(x,0));
	while(!que.empty())
	{
		node p=que.top();
		que.pop();
		int now=p.num;
		int Max;
		for(int i=head[now];i!=-1;i=edge[i].next)
		{
			Edge e=edge[i];
			Max=max(dis[now],e.w);
			if(dis[e.to]>Max)
			{
				dis[e.to]=Max;
				que.push(node(e.to,dis[e.to]));
			}
		}
	}
}
int main()
{
	int x,y,w;
	while(cin>>n>>m)
	{
		memset(head,-1,sizeof(head));
		for(int i=1;i<=m;i++)
		{
			cin>>x>>y>>w;
			add(x,y,w);
		} 
		dij(1);
		cout << dis[n] << endl;
	}
	return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int mod=1e9+7;
const int maxn=205;
int n,m,ans;
bool book[maxn];
struct node
{
   int to,w;
};
vector<node>v[maxn];
void dfs(int e,int temp_Max)
{
   if(e==n)
   {
      ans=min(ans,temp_Max);
      return ;
   }
   if(temp_Max>=ans)
      return ;
   for(int i=0;i<v[e].size();i++)
   {
      int u=v[e][i].to;
      int w=v[e][i].w;
      if(book[u]==true)
         continue;
      book[u]=true;
      dfs(u,max(temp_Max,w));
      book[u]=false;
   }
}
int main()
{
    while(cin>>n>>m)
    {
       for(int i=0;i<maxn;i++)
         v[i].clear();
       for(int i=0;i<m;i++)
       {
          int a,b,c;
          cin>>a>>b>>c;
          node t;
          t.to=b;
          t.w=c;
          v[a].push_back(t);
       }
       ans=INF;
       memset(book,false,sizeof(book));
       dfs(1,0);
       cout << ans <<endl;
    }
}