记录编号 25998 评测结果 AAAAAAAAAAAAAAAAA
题目名称 网络探测 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.075 s
提交时间 2011-07-22 15:46:07 内存使用 11.88 MiB
显示代码纯文本
#include <cstdio>
#include <queue>
using namespace std;

#define pb push_back
#define mp make_pair
typedef pair<int,pair<int,int> > Pair;
const int MAXN=1005;
const int oo=~0u>>2;

struct Node
{
	int v,w;
	Node *next;
	Node(){}
	Node(int _v,int _w,Node *_next):
		v(_v),w(_w),next(_next){}
	void *operator new (size_t,void *p){return p;}
}*adj[MAXN],pool[MAXN*MAXN],*mem=pool;

inline void addedge(int u,int v,int w)
{
	adj[u]=new (mem++)Node(v,w,adj[u]);
	adj[v]=new (mem++)Node(u,w,adj[v]);
}

int S=0,T;
int dis[MAXN][11];
bool sure[MAXN][11];
int N,M;
priority_queue<Pair,vector<Pair>,greater<Pair> > q;
void dijkstra()
{
	for(int i=0;i<N;i++)
		for(int j=0;j<=10;j++)
			dis[i][j]=oo;
	dis[S][0]=0;
	q.push(mp(dis[S][0],mp(S,0)));
	while(q.size())
	{
		int u1,u2,nd;
		do
		{
			u1=q.top().second.first;
			u2=q.top().second.second;
			q.pop();
		}while(sure[u1][u2]);
		if (dis[u1][u2]==oo)
			break;
		if (u1==T)
		{
			printf("%d\n",dis[u1][u2]);
			return ;
		}
		if (u2==10)
			continue;
		sure[u1][u2]=true;
		for(Node *p=adj[u1];p;p=p->next)
			if (!sure[p->v][u2+1] && dis[p->v][u2+1]>(nd=dis[u1][u2]+p->w))
			{
				dis[p->v][u2+1]=nd;
				q.push(mp(nd,mp(p->v,u2+1)));
			}
	}
	printf("no\n");
}

int main()
{
	freopen("ping.in","r",stdin);
	freopen("ping.out","w",stdout);
	scanf("%d%d%d",&N,&M,&T);
	for(int i=0;i<M;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		addedge(u,v,w);
	}
	dijkstra();
	return 0;
}