比赛 20120705 评测结果 AAAAAAAAAA
题目名称 塔防游戏 最终得分 100
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-05 10:51:39
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>

using namespace std;

int n,m,ts,te,ans,s[1001];

bool flag[1001],f[1001][1001];

vector <int> u[1001],v[1001],last[1001];

queue <int> q;

void dfs(int k)
{
	if(k==ts)
	{
		ans++;
		flag[0]=false;
		for(int i=ts;s[i];i=s[i])
		{
			f[s[i]][i]=false;
			f[i][s[i]]=true;
		}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(f[k][i]&&flag[i])
		{
			flag[i]=false;
			s[i]=k;
			dfs(i);
			if(!flag[0])return;
		}
	}
}

int main()
{
	freopen("defence.in","r",stdin);
	freopen("defence.out","w",stdout);
	int i,j,x,y,z;
	scanf("%d%d%d%d",&n,&m,&ts,&te);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		u[x].push_back(y);
		v[x].push_back(z);
		u[y].push_back(x);
		v[y].push_back(z);
	}
	memset(s,60,sizeof(s));
	s[ts]=0;flag[ts]=true;
	q.push(ts);
	while(!q.empty())
	{
		x=q.front();
		for(i=0;i<u[x].size();i++)
		{
			y=u[x][i];z=v[x][i];
			if(s[x]+z<s[y])
			{
				last[y].clear();
				s[y]=s[x]+z;
				if(!flag[y])
				{
					flag[y]=true;
					q.push(y);
				}
			}
			if(s[x]+z==s[y])
			{
				last[y].push_back(x);
			}
		}
		flag[x]=false;
		q.pop();
	}
	for(i=1;i<=n;i++)
	{
		for(j=0;j<last[i].size();j++)
		{
			f[i][last[i][j]]=true;
		}
	}
	s[te]=0;
	while(!flag[0])
	{
		memset(flag,1,sizeof(flag));
		flag[te]=false;
		dfs(te);
	}
	printf("%d\n",ans);
	return 0;
}