比赛 “Asm.Def战记之拉格朗日点”杯 评测结果 RRRRRRRRRR
题目名称 Asm.Def的打击序列 最终得分 0
用户昵称 FETS 1/3 运行时间 0.012 s
代码语言 C++ 内存使用 0.91 MiB
提交时间 2015-11-04 10:49:41
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=250;
const int maxm=30055;
int n,m,c;
struct edge
{
	int x;
	int y;
	int v;
	int next;
};
edge e[maxm];
int qdb[maxn];
int t=0;
inline void insert(int u,int v,int va)
{
	e[++t].x=u;
	e[t].y=v;
	e[t].v=va;
	e[t].next=qdb[u];
	qdb[u]=t;
}
int f[maxn][maxn];
int q[maxn*2];
int head=1;
int tail=0;
int ans=0;
int vis[maxn]={};
void bfs(int st)
{
	q[++tail]=st;
	vis[st]=1;
	ans+=c;
	for(;head<=tail;head++)
	{
		int minv=99999999;
		int minid=0;
		for(int i=qdb[q[head]];i;i=e[i].next)
		{
			if(e[i].v>c)
			{
				ans+=c;
				vis[e[i].y]=1;
				continue;
			}
			if(e[i].v<minv)
			{
				minv=min(minv,e[i].v);
				minid=i;
			}
		}
		if(minid==0)
			break;
		if(!vis[e[minid].y])
		{
			vis[e[minid].y]=1;
			q[++tail]=e[minid].y;
			ans+=e[minid].v;
		}
		else if(e[minid].y==st)
		{
			ans-=c;
			ans+=e[minid].v;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==0)
			bfs(i);
	}
}
/*4 3 10
1 2 2
2 3 2
3 1 2*/
int main()
{
	memset(f,1,sizeof(f));
	scanf("%d %d %d",&n,&m,&c);
	int te=c*n;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		if(f[a][b]>c)
			f[a][b]=c;
		insert(a,b,c);
	}
	bfs(1);
	if(ans>te)
	{
		cout<<te;
	}
	else
		cout<<ans;
	return 0;
}